忠实地保留已解析 XML 中的注释

2024-02-25

我希望在操作 XML 时尽可能忠实地保留注释。

我设法保留了注释,但内容正在被 XML 转义。

#!/usr/bin/env python
# add_host_to_tomcat.py

import xml.etree.ElementTree as ET
from CommentedTreeBuilder import CommentedTreeBuilder
parser = CommentedTreeBuilder()

if __name__ == '__main__':
    filename = "/opt/lucee/tomcat/conf/server.xml"

    # this is the important part: use the comment-preserving parser
    tree = ET.parse(filename, parser)

    # get the node to add a child to
    engine_node = tree.find("./Service/Engine")

    # add a node: Engine.Host
    host_node = ET.SubElement(
        engine_node,
        "Host",
        name="local.mysite.com",
        appBase="webapps"
    )
    # add a child to new node: Engine.Host.Context
    ET.SubElement(
        host_node,
        'Context',
        path="",
        docBase="/path/to/doc/base"
    )

    tree.write('out.xml')
#!/usr/bin/env python
# CommentedTreeBuilder.py

from xml.etree import ElementTree

class CommentedTreeBuilder ( ElementTree.XMLTreeBuilder ):
    def __init__ ( self, html = 0, target = None ):
        ElementTree.XMLTreeBuilder.__init__( self, html, target )
        self._parser.CommentHandler = self.handle_comment

    def handle_comment ( self, data ):
        self._target.start( ElementTree.Comment, {} )
        self._target.data( data )
        self._target.end( ElementTree.Comment )

然而,评论如下:

  <!--
EXAMPLE HOST ENTRY:
    <Host name="lucee.org" appBase="webapps">
         <Context path="" docBase="/var/sites/getrailo.org" />
     <Alias>www.lucee.org</Alias>
     <Alias>my.lucee.org</Alias>
    </Host>

HOST ENTRY TEMPLATE:
    <Host name="[ENTER DOMAIN NAME]" appBase="webapps">
         <Context path="" docBase="[ENTER SYSTEM PATH]" />
     <Alias>[ENTER DOMAIN ALIAS]</Alias>
    </Host>
  -->

最终为:

  <!--
            EXAMPLE HOST ENTRY:
    &lt;Host name="lucee.org" appBase="webapps"&gt;
         &lt;Context path="" docBase="/var/sites/getrailo.org" /&gt;
         &lt;Alias&gt;www.lucee.org&lt;/Alias&gt;
         &lt;Alias&gt;my.lucee.org&lt;/Alias&gt;
    &lt;/Host&gt;

    HOST ENTRY TEMPLATE:
    &lt;Host name="[ENTER DOMAIN NAME]" appBase="webapps"&gt;
         &lt;Context path="" docBase="[ENTER SYSTEM PATH]" /&gt;
         &lt;Alias&gt;[ENTER DOMAIN ALIAS]&lt;/Alias&gt;
    &lt;/Host&gt;
   -->

我也尝试过self._target.data( saxutils.unescape(data) ) in CommentedTreeBuilder.py,但似乎没有做任何事情。事实上,我认为问题发生在之后的某个地方handle_commment() step.

顺便说一句,这个问题类似于this https://stackoverflow.com/questions/4474754/how-to-keep-comments-while-parsing-xml-using-python-elementtree.


使用 Python 2.7 和 3.5 进行测试,以下代码应按预期工作。

#!/usr/bin/env python
# CommentedTreeBuilder.py
from xml.etree import ElementTree

class CommentedTreeBuilder(ElementTree.TreeBuilder):
    def comment(self, data):
        self.start(ElementTree.Comment, {})
        self.data(data)
        self.end(ElementTree.Comment)

然后,在主代码中使用

parser = ElementTree.XMLParser(target=CommentedTreeBuilder())

作为解析器而不是当前解析器。

顺便说一句,评论可以正常工作lxml。也就是说,你可以这样做

import lxml.etree as ET
tree = ET.parse(filename)

无需上述任何一项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

忠实地保留已解析 XML 中的注释 的相关文章

  • 计时器显示负的已用时间

    我正在使用一个非常简单的代码来计算每个循环的时间for陈述 它看起来像这样 import time for item in list of files Start timing this loop start time clock Do a
  • Conda 无法在 Powershell 中激活

    我已经在我的 Windows 10 笔记本电脑上安装了 anaconda 我正在尝试激活名为的Python环境pyenv 首先 我检查conda env list在我的笔记本电脑中 这是 powershell 上的输出 PS C Users
  • 将文本视图添加到布局中?

    如果我的按钮不移动 我就无法在按钮上方放置文本视图 我该如何解决这个问题 被困在这个问题上 4 个小时了 这很伤心 因为我正在尝试在我的布局上添加一个文本视图 我的布局中心有 4 个按钮 我只想在四个按钮上方添加一个文本视图 如下所示 Te
  • 嵌套重组 - Django

    我有一个包含以下字段的模型 日期 员工 和 计划时间 每个员工对于不同的日期都有不同的计划工作时间 我正在尝试构建我的模板 其中员工按行列出 他们的计划工作时间列在正确的相应日期下的列中 像这样的东西 https i stack imgur
  • Pandas 过滤 - 非索引列上的 Between_time

    我需要过滤掉特定时间的数据 DataFrame 函数 Between time 似乎是执行此操作的正确方法 但是 它仅适用于数据帧的索引列 但我需要原始格式的数据 例如 数据透视表期望日期时间列具有正确的名称 而不是索引 这意味着每个过滤器
  • 使用 theano 进行多处理

    我正在尝试将 theano 与 cpu 多处理和神经网络库 Keras 结合使用 I use device gpu标记并加载 keras 模型 然后 为了提取超过一百万张图像的特征 我使用多处理池 该函数看起来像这样 from keras
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • 包含可变数据的正则表达式 - ply.lex

    我正在使用 python 模块ply lex编写一个词法分析器 我用正则表达式指定了一些标记 但现在我卡住了 我有一个list of Keywords谁应该是token data是一个包含大约 1000 个关键字的列表 这些关键字都应该被识
  • Python ttk.combobox 强制发布/打开

    我正在尝试扩展 ttk 组合框类以允许自动建议 我到目前为止的代码运行良好 但我想让它在输入一些文本后显示下拉列表 而不从小部件的输入部分移除焦点 我正在努力解决的部分是找到一种强制下拉的方法 在 python 文档中我找不到任何提及这一点
  • 从 python 的单词列表中查找最长的常见单词序列

    我搜索了很多解决方案 确实发现了类似的问题 这个答案 https stackoverflow com questions 21930757 longest repeated substring返回可能不属于输入列表中所有字符串的最长字符序列
  • 为线条指定颜色

    我试图在 matplotlib 中绘制可变数量的行 其中 X Y 数据和颜色存储在 numpy 数组中 如下所示 有没有办法将颜色数组传递到绘图函数中 这样我就不必采取额外的步骤来单独为每条线分配颜色 我是否应该将 RGB 颜色数组转换为另
  • UTF-8 在 Python 日志记录中,如何?

    我正在尝试使用 Python 的日志记录包将 UTF 8 编码的字符串记录到文件中 作为一个玩具示例 import logging def logging test handler logging FileHandler home ted
  • Google App Engine 开发服务器中的 PyCrypto“ImportError:无法导入名称 blockalgo”

    我有一个使用 PyCrypto 使用 AES 加密字符串的函数 当我在单元测试中调用该函数时 一切正常 在生产环境中 它也运行得很好 但是 在GAE开发服务器上调用该函数时 会抛出错误 ImportError 无法导入名称blockalgo
  • 来自异常导入 PendingDeprecationWarning ModuleNotFoundError:没有名为“异常”的模块

    我正在尝试使用Python 创建一个word 文档 我在终端中 pip install python docx 我的代码如下所示 from docx import Document document Document document sa
  • 鉴于我的代码是开源的并且我在服务器上运行,并且我接受近乎原始的代码,那么对我来说最糟糕的情况是什么?

    我正在研究几个案例 在这些案例中 接受近乎原始的代码会容易得多 所以 如果你不能使用 lambda 你能对表达式做的最糟糕的事情是什么 以及如何做 如果不能使用 import 那么对执行的代码最糟糕的情况是什么 如何使用 不能使用 X 扫描
  • 将 numpy 记录数组转换为字典列表的有效方法

    如何转换下面的 numpy 记录数组 recs Bill 31 260 0 Fred 15 145 0 r rec fromrecords recs names name age weight formats S30 i2 f4 到字典列表
  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru
  • PyTorch 中的交叉熵

    交叉熵公式 但为什么下面给出loss 0 7437代替loss 0 since 1 log 1 0 import torch import torch nn as nn from torch autograd import Variable
  • 开始使用 Python 在 CSV 的特定行上读写

    我有一个 CSV 文件 如下所示 COL A COL B 12345 A 1 B 2 C 3 如何读取该文件并将其写回新文件 但只写第二行 行 我希望输出文件包含 12345 A 1 B 2 C 3 Thanks 下面读取您的 csv 提取
  • 多行 x 刻度标签

    我正在尝试制作类似于此 Excel 示例的图 我想知道 x 刻度标签上是否有第二层 例如 5 年统计摘要 我知道我可以使用制作多行刻度标签 n但我希望能够独立地转换这两个级别 这很接近 fig plt figure figsize 8 4

随机推荐

  • 更改 Mac/Linux 上进程的用户所有者?

    我有一个以 root 身份运行的程序 该应用程序调用另一个程序 processA 来运行 当 processA 运行时 它由 root 拥有 但我希望它的所有者是当前登录的用户 怎么做 嗯 这有点棘手 取决于它是守护进程 服务 还是运行此命
  • 可以从 Google Chrome 设置面板中的地址栏(小书签)运行 Javascript 吗?

    我想制作一个书签来打开谷歌浏览器的设置面板并通过单击清除我的缓存 一段时间以来 我有一个书签 可以打开 Chrome 的设置面板 并已选择 清除缓存 设置 单击书签 通常在新选项卡中打开它 后 我必须打开该选项卡并提交表单 然而 在开发时
  • msiexec MsiSetExternalUI 的外部处理程序

    早上好 我希望为 msiexec 实现一个外部处理程序 但不能阻止 msiexec 执行任何不同的操作 我希望能够利用 MsiSetExternalUI 拦截所有消息 但仍然对最终用户具有相同的响应和对话框 我的主要目标是拦截安装 msi
  • UIImage 方面适合并对齐到顶部

    看起来像aspect fit默认情况下将图像与框架底部对齐 有没有办法override对齐同时保持aspect fit intact 编辑 这个问题早于自动布局 事实上 在提出这个问题的同一周 汽车布局就在 WWDC 2012 上公布了 简
  • 如何使用 ChefSpec 测试我的 LWRP?

    我创建了自定义 LWRP 但是当我运行ChefSpec https github com sethvargo chefspec单元测试 它不知道我的 LWRP 操作 这是我的resource actions install uninstal
  • 配置文件模板生成makefile

    Linux 中几乎所有开源 C 项目都有一个 配置 文件 用于在构建源代码之前生成 Makefile 我正在从头开始编写一个项目 这个 配置 文件有任何模板吗 大多数时候 配置文件不是手动创建的 而是由诸如autoconf http www
  • 在 Windows 10 上的 Lyrix.exe(Delphi 7 旧应用程序)上加载数据库时出错

    有一个用 Delphi 7 编写的名为 Lyrix 的应用程序 似乎 我只有可执行文件夹 以及不再运行的安装程序 我无法让它在 Windows 10 上运行 但它似乎在 Windows XP 7 和 8 1 上运行良好 它说 Error c
  • 如何使用CHMOD获得“drwx---r-x+”文件夹权限? - Bash 脚本 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在通过网络移动某些文件时遇到问题 这似乎是由文件权限引起的 目前我有具有此权限 drwxrwxrwx 的文件夹 我需要运行一个 bash
  • 录制第二个音频剪辑时 MediaRecorder 崩溃

    我正在尝试使用 MediaRecorder 录制音频剪辑 但当我启动 停止和再次启动时 我的 Logcat 中不断出现这些错误 该活动也将结束 INFO DEBUG 1285 INFO DEBUG 1285 Build fingerprin
  • Apache poi 分页符

    我需要创建一个简单的 Word 文档用于从 java 程序打印 有必要将输出打印在单独的页面上 我正在使用以下代码 XWPFDocument document new XWPFDocument XWPFParagraph paragraph
  • 读取文件内容时出现奇怪的字符

    我不确定出了什么问题 for line in open textfile r print line Output abcd 该文件是使用 textpad 使用 Unix EOL 和 UTF8 编码创建的 现在 它可以在 notepad 上使
  • 屏幕阅读器无法读取 Firefox 中的 Aria-Live

    我遇到一个问题 屏幕阅读器无法读取 FireFox 中 aria live 部分中更改的文本 这是一个简单的页面示例 在 Chrome 中 屏幕阅读器会读取更改 而在 FireFox 中则不会 div div 难道我做错了什么 除了人们在
  • MySQL查询选择过去N天的记录

    我有一张桌子 上面有date added列的格式为2014 09 30 20 39 17我有一个网页 其中包含供用户使用的过滤器选项 基本上我想使用变量来选择不同的日期范围 如下所示 SELECT FROM table WHERE date
  • Pandas:如何将多索引数据帧与单个索引数据帧连接起来,以及自定义排序

    我有一个 MultiIndex pandas DataFramedf multi like import pandas as pd df multi pd DataFrame A A1 0 234 2002 A A1 1 324 2550
  • 添加角度为 10 的 swagger-UI

    如何添加招摇的用户界面在你的角度应用程序中 我已经多次搜索这个问题 发现只有一个解决方案 并且它是使用完成的swagger ui dist包 但在最新版本的https www npmjs com package swagger ui告诉使用
  • NSTextField 优于 NSOpenGLView

    我用 NSOpenGLView 创建了一个窗口 将 openGL 内容渲染到其中 我想向视图添加一些按钮和文本字段 我可以使用界面生成器 或代码 添加 NSTextFields 和 NSButtons 但它们不会出现 NSOpenGLVie
  • 如何修改Eclipse代码辅助中非活动行的颜色?

    首先 已经有类似的问题 https stackoverflow com questions 4402087 how to change the color of the currently selected line in a code a
  • 如何强制安装软件包?

    我正在尝试通过以下方式安装以下软件包composer https packagist org packages cartalyst sentry dev feature laravel 5 https packagist org packa
  • 为什么 JAXB 2 RI 的 XJC 简单模式会更改集合名称?

    JAXB简单绑定模式将集合名称修改为其复数 版本 例如 附加数据 变为 附加数据 有什么解决方案可以改变这种行为吗 我需要一个与 XSD 字段名称相同的 Java 字段名称和方法名称 我的绑定文件
  • 忠实地保留已解析 XML 中的注释

    我希望在操作 XML 时尽可能忠实地保留注释 我设法保留了注释 但内容正在被 XML 转义 usr bin env python add host to tomcat py import xml etree ElementTree as E