我想将tag.text Package 到CDATA中:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<tag>
some data
<!-- some data2 -->
<!-- some data2 -->
some data
</tag>
</root>
但是当我解析tag.text时,里面有注解,只解析注解之前的文本:
from lxml import etree
parser = etree.XMLParser()
#parser = etree.XMLParser(remove_comments=True)
tree = etree.parse("./data.xml", parser)
root = tree.getroot()
for tag in root.findall("tag"):
tag.text = etree.CDATA(tag.text)
tree.write("./result.xml",
encoding = "utf-8",
xml_declaration = True)
我得到了这个(tag.text = some data):
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tag><![CDATA[
some data
]]><!-- some data2 -->
<!-- some data2 -->
some data
</tag>
</root>
怎么修?
5条答案
按热度按时间whlutmcx1#
请考虑使用saxonche和XSLT 3.0:
XSLT3是例如
sample1.xml是您的输入:
包含文件的公共Gist:https://gist.github.com/martin-honnen/61b91233fd73369d55f392ad4a0cee0b。
vsdwdz232#
如果要连接
<tag>
元素中的所有文本,可以对elementsitertext
方法使用str.join
方法。这将在传递给CDATA
方法之前连接所有包括空格在内的文本。在您的示例中,注解被视为
<tag>
元素的子元素。当使用itertext
方法时,将迭代尾部文本。arknldoa3#
我发现了一种巧妙的方法来解析和修改文本,注解和尾部:
如果有人知道更正确/漂亮的方法来做这件事(例如,像tag.all这样的东西),请写信。
l2osamch4#
迭代
tag
元素,得到它的文本+注解元素的文本表示(没有尾文本)+任何尾文本(包括缩进)。然后删除子元素并使用CDATA Package 文本填充标记元素。结果
gwo2fgha5#
xml.etree.ElementTree
拥有ET.iterparse()
,负责检测事件,包括注解:输出:
以下是
lxml
的采用情况:输出: