ElementTree是一个用于创建和解析XML的Python库。
在 python 中执行我的第一步时,我尝试解析和更新 xml 文件。 xml如下: 在 python 中执行第一步时,我尝试解析并更新 xml 文件。 xml如下: <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet href="util/style/aaaa-2-0.xsl" type="text/xsl"?> <test dtd-version="3.2" xmlns:test="http://www.ich.org/test" xmlns:xlink="http://www.w3c.org/1999/xlink"> <mr> <leaf checksum="88ed245997a341a4c7d1e40d614eb14f" > <title>book name</title> </leaf> </mr> </test> 我想更新校验和的值。我已经用一种方法编写了一个类: @staticmethod def replace_checksum_in_index_xml(xml_file_path, checksum): logging.debug(f"ReplaceChecksumInIndexXml xml_file_path: {xml_file_path}") try: from xml.etree import ElementTree as et tree = et.parse(xml_file_path) tree.find('.//leaf').set("checksum", checksum) tree.write(xml_file_path) except Exception as e: logging.error(f"Error updating checksum in {xml_file_path}: {e}") 我调用该方法: xml_file_path = "index.xml" checksum = "aaabbb" Hashes.replace_checksum_in_index_xml(xml_file_path, checksum) 校验和确实已更新。而且整个 xml 结构也发生了变化: <test dtd-version="3.2"> <mr> <leaf checksum="aaabbb"> <title>book name</title> </leaf> </mr> </test> 如何仅更新给定节点,而不更改给定 xml 文件中的其他任何内容? 不幸的是,我还没有找到使用您正在使用的库 xml.etree 的解决方案。相反,请考虑使用 lxml。以下对我有用: class Hashes: @staticmethod def replace_checksum_in_index_xml(xml_file_path, checksum): try: from lxml import etree tree = etree.parse(xml_file_path) leaf = tree.find('.//leaf') if leaf is not None: leaf.set("checksum", checksum) with open(xml_file_path, 'wb') as file: tree.write(file, xml_declaration=True, encoding='utf-8', pretty_print=False) except Exception as e: print(f"Error updating checksum in {xml_file_path}: {e}")
我有一个与此类似的 XML 文件: 一些坏文字那个我做不想要保留。 我有一个与此类似的XML文件: <root> <a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a> </root> 我想删除 <b> 或 <u> 元素(和后代)中的所有文本,并打印其余部分。这是我尝试过的: from __future__ import print_function import xml.etree.ElementTree as ET tree = ET.parse('a.xml') root = tree.getroot() parent_map = {c:p for p in root.iter() for c in p} for item in root.findall('.//b'): parent_map[item].remove(item) for item in root.findall('.//u'): parent_map[item].remove(item) print(''.join(root.itertext()).strip()) (我使用这个答案中的食谱来构建parent_map)。当然,问题是,对于 remove(item),我还删除了元素后面的文本,结果是: Some that I 而我想要的是: Some text that I want to keep. 有什么解决办法吗? 如果您最终不会使用更好的东西,您可以使用 clear() 而不是 remove() 保留元素的尾部: import xml.etree.ElementTree as ET data = """<root> <a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a> </root>""" tree = ET.fromstring(data) a = tree.find('a') for element in a: if element.tag in ('b', 'u'): tail = element.tail element.clear() element.tail = tail print ET.tostring(tree) 打印(参见空的 b 和 u 标签): <root> <a>Some <b /> text <i>that</i> I <u /> want to keep.</a> </root> 另外,这里有一个使用xml.dom.minodom的解决方案: import xml.dom.minidom data = """<root> <a>Some <b>bad</b> text <i>that</i> I <u>do <i>not</i></u> want to keep.</a> </root>""" dom = xml.dom.minidom.parseString(data) a = dom.getElementsByTagName('a')[0] for child in a.childNodes: if getattr(child, 'tagName', '') in ('u', 'b'): a.removeChild(child) print dom.toxml() 打印: <?xml version="1.0" ?><root> <a>Some text <i>that</i> I want to keep.</a> </root> 我最终得到了以下算法,该算法删除子元素但保留周围的文本(element是感兴趣的ET.Element): last = None for c in list(element): if your_condition: if c.tail: if last is None: element.text = (element.text or '') + c.tail else: last.tail = (last.tail or '') + c.tail element.remove(c)
导入 xml.etree.ElementTree 作为 ET 树:ET = ET.parse(文件) tree.find('.//ns1:tag/@someattribute', ns) 导致 {KeyError}'@',据我所知,xpath 表达式是正确的,是否有...
我想使用 ElementTree (Python 3.8) 在 XML 文件中的根元素之前添加 xml 样式表处理指令。 您可以在下面找到我用来创建 XML 文件的代码 导入 xml.e...
我有一个字符串格式的.xml xmlString,如下所示 瓮:内容项目:7WBG-8H88-Y898-B277-00000-00-1 <
使用 xml.etree.ElementTree 添加节点到 XML 时如何添加命名空间?
我有下一个代码来解析一个 XML 字符串,然后向 XML 添加一个新节点。但你可以看到我的代码只能添加w...
在Python ElementTree中,如何获取树中元素的所有祖先的列表?
我需要“get_ancestors_recursively”函数。 样本运行可以是 >>> 转储(tr) >>>
所以我使用Python 3.2.1的cElementTree解析一些XML文件,在解析过程中我注意到一些标签缺少属性信息。我想知道是否有任何简单的方法
我需要制作一个Python脚本来获取相机配置并检查OSD中写入的内容。我编写了直接从它们下载 XML 文件的代码,然后对其进行解析,以便
使用 ElementTree.tostring 的 default_namespace 参数会引发错误
我想使用 ElementTree 修改 XML 文档并保持其可比性,我希望新文件中具有与旧文件中相同的命名空间前缀。 但是,default_namespace= 参数...
xml.etree.ElementTree 的 XML 放置问题
我正在使用 Python 的 xml.etree.ElementTree 生成 XML,但遇到了 XML 子元素出现在与预期不同的标签下的问题。 我的函数如下所示: 定义
如何告诉lxml.etree.tostring(element)不要在python中写命名空间?
我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 的条目 我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 <to_move>: 的条目 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move date="somedate"> <child>some text</child> ... ... </to_move> ... </some> 我使用 lxml.etree.iterparse 来迭代该文件。工作正常。当我找到带有标签 <to_move> 的元素时,我们假设它存储在变量 element 中,我这样做 new_file.write(etree.tostring(element)) 但这会导致 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move xmlns:="some" date="somedate"> # <---- Here is the problem. I don't want the namespace. <child>some text</child> ... ... </to_move> ... </some> 所以问题是:如何告诉 etree.tostring() 不要写 xmlns:="some"。这可能吗?我在 lxml.etree 的 api 文档中苦苦挣扎,但找不到满意的答案。 这是我找到的etree.trostring: tostring(element_or_tree, encoding=None, method="xml", xml_declaration=None, pretty_print=False, with_tail=True, standalone=None, doctype=None, exclusive=False, with_comments=True) 将元素序列化为其 XML 的编码字符串表示形式 树。 对我来说tostring()的每一个参数似乎都没有帮助。有什么建议或者更正吗? 我经常抓住一个命名空间来为它创建一个别名,如下所示: someXML = lxml.etree.XML(someString) if ns is None: ns = {"m": someXML.tag.split("}")[0][1:]} someid = someXML.xpath('.//m:ImportantThing//m:ID', namespaces=ns) 您可以执行类似的操作来获取名称空间,以便创建一个正则表达式,该正则表达式将在使用 tostring 后清理它。 或者您可以清理输入字符串。找到第一个空格,检查其后面是否有xmlns,如果有,则删除整个xmlns位直到下一个空格,如果没有则删除该空格。重复此操作,直到不再有空格或 xmlns 声明。但不要超过第一个>。 这更多是对“unutbu”答案的评论,其中需要清理命名空间的建议,但没有给出示例。这可能就是您正在寻找的... from lxml import objectify objectify.deannotate(root, cleanup_namespaces=True) 有一种方法可以使用 XSLT 删除名称空间: import io import lxml.etree as ET def remove_namespaces(doc): # http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="no"/> <xsl:template match="/|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet> ''' xslt_doc = ET.parse(io.BytesIO(xslt)) transform = ET.XSLT(xslt_doc) doc = transform(doc) return doc doc = ET.parse('data.xml') doc = remove_namespaces(doc) print(ET.tostring(doc)) 产量 <some> <to_move date="somedate"> <child>some text</child> </to_move> </some> 这是一个古老的问题,但由于 13 年后 lxml 仍然没有内置这个明显的函数,处理它的最简单方法是使用正则表达式: def get_text(element: etree.Element) -> str: s = etree.tostring(element).decode() if m := re.match(r'^<(\w*)[^>]*>((.|\n)+)<\/\1>', s): return m.group(2).strip() return s 这会剥离整个包含元素 <description blah blah blah><div>What we want</div><p>more stuff</p></description> 并仅返回 <description> 内的标记。为了安全起见,它会保存开始元素标记以在末尾进行匹配(使用 \1 反向引用),但寻找结束 <\ 效果很好,因为贪婪匹配会跳过内容中嵌入的所有其他元素。 如果匹配失败,引发 ValueError 可能会更好,但这只会返回原始的丑陋字符串、命名空间和所有内容。
给定 etree 中的元素,我想仅打印开始标签。这对于调试非常有用。 例如: >>> 从 lxml 导入 etree >>> elem = etree。
我正在使用 lxml.etree 库将 XML 文件拼接在一起,并且命名空间在写入时被删除。 输入.xml ...
我想利用 ElementTree python 库解析 SimpleData 标签中找到的“ID2”名称属性。 ...
XML elementTree 在换行符后截断文本 ( )在Python中
我正在解析文本,其中一个孩子的文本如下所示: ” 相互扩散,在存在化学势梯度的情况下发生并导致 m...
而不是: 在 XML 文件中,我需要: 一个丑陋的解决方法是将空格写入文本(而不是空的条...
我有以下代码来编辑XML 导入 xml.etree.ElementTree 作为 ET 数据 = b'xxx...