elementtree 相关问题

ElementTree是一个用于创建和解析XML的Python库。

ElementTree 找不到子元素之一

我查看了有关此问题的其他问题,但没有一个对我有帮助。我正在使用 ElementTree 解析 XML,但在查找特定标签时遇到问题,该标签可能是可选的,而我可以

回答 2 投票 0

Python 将嵌套 XML 与未排序的兄弟姐妹一起排序

我需要使用 Elementtree 按 reqdate 对以下示例 XML 的“行”元素进行排序(desc - 从最新到最旧)。 1234 我需要使用 Elementtree 按 reqdate 对以下示例 XML 的“行”元素进行排序(desc - 从最近到最旧)。 <doc> <header> <ordernum>1234</ordernum> <customer>1</customer> <line> <lineno>1</lineno> <reqdat>2024-01-01</reqdat> </line> <line> <lineno>2</lineno> <reqdat>2024-03-01</reqdat> </line> <line> <lineno>3</lineno> <reqdat>2024-02-01</reqdat> </line> </header> </doc> 我正在寻找的结果如下。 <doc> <header> <ordernum>1234</ordernum> <customer>1</customer> <line> <lineno>2</lineno> <reqdat>2024-03-01</reqdat> </line> <line> <lineno>3</lineno> <reqdat>2024-02-01</reqdat> </line> <line> <lineno>1</lineno> <reqdat>2024-01-01</reqdat> </line> </header> </doc> 用例是将其发送到使用 XML 中的顺序的打印机,并且需要按此顺序打印各行。 我正在尝试排序函数和 lambda 排序,但还没有弄清楚。 尝试: import xml.etree.ElementTree as ET xml_string = """ <doc> <header> <ordernum>1234</ordernum> <customer>1</customer> <line> <lineno>1</lineno> <reqdat>2024-01-01</reqdat> </line> <line> <lineno>2</lineno> <reqdat>2024-03-01</reqdat> </line> <line> <lineno>3</lineno> <reqdat>2024-02-01</reqdat> </line> </header> </doc> """ root = ET.fromstring(xml_string) header = root.find(".//header") lines = header.findall(".//line") lines = sorted(lines, key=lambda tag: tag.find("reqdat").text, reverse=True) for l in list(header): if l.tag == "line": header.remove(l) for l in lines: header.append(l) print(ET.tostring(root, encoding="unicode")) 打印: <doc> <header> <ordernum>1234</ordernum> <customer>1</customer> <line> <lineno>2</lineno> <reqdat>2024-03-01</reqdat> </line> <line> <lineno>3</lineno> <reqdat>2024-02-01</reqdat> </line> <line> <lineno>1</lineno> <reqdat>2024-01-01</reqdat> </line> </header> </doc>

回答 1 投票 0

ElementTree XPath - 根据属性选择元素

我在 ElementTree 中使用属性 XPath 选择器时遇到问题,根据文档我应该能够做到这一点 这是一些示例代码 XML 我在 ElementTree 中使用属性 XPath 选择器时遇到问题,我应该能够根据 Documentation 做到这一点 这是一些示例代码 XML <root> <target name="1"> <a></a> <b></b> </target> <target name="2"> <a></a> <b></b> </target> </root> Python def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children 我收到以下异常: expected path separator ([) 您尝试使用的语法是 ElementTree 1.3 中的新语法。 此类版本随 Python 2.7 或更高版本一起提供。 如果您有 Python 2.6 或更低版本,您仍然拥有 ElementTree 1.2.6 或更低版本。 这段代码有几个问题。 Python 的内置 ElementTree(简称 ET)没有真正的 XPATH 支持;仅有限的子集 例如,它不支持 find-from-root 表达式,例如 //target。 注意:文档 提到“//”,但仅适用于儿童:因此表达式为 .//target有效; //... 不是! 还有一个替代实现:lxml,它更丰富。对于内置代码来说,这是使用文档的接缝。这不匹配/工作。 @name表示法选择xml-attributes; xml 标签内的 key=value 表达式。 因此名称-值必须为 1 或 2 才能在给定文档中选择某些内容。或者,可以搜索带有子 element 'a' 的目标:target[a](无 @)。 对于给定的文档,使用内置 ElementTree (v1.3) 解析为 root,以下代码是正确且有效的: root.findall(".//target") 找到两个目标 root.findall(".//target/a") 找到两个a元素 root.findall(".//target[a]") 这会再次找到两个目标元素,因为两者都有一个 a 元素 root.findall(".//target[@name='1']") 仅查找 first 目标。请注意,需要 1 左右的引号;否则会引发语法错误 root.findall(".//target[a][@name='1']") 也有效;找到那个目标 root.findall(".//target[@name='1']/a") 仅查找一个 a 元素; ...

回答 2 投票 0

在 Python 中重新组合 root.findall(".//") 中的元素

我正在将 BytesIO SVG 数据解析为元素树。我从以下内容开始: 树 = ET.parse(svg) 根 = 树.getroot() 根在哪里: ...

回答 1 投票 0

Python:xml ElementTree(或 lxml)中的命名空间

我想检索旧版 xml 文件,操作并保存它。 这是我的代码: 从 xml.etree 导入 cElementTree 作为 ET NS =“{http://www.somedomain.com/XI/Traffic/10}” def fix_xml(文件名): ...

回答 2 投票 0

使用 xml.etree.ElementTree 在 Python 中进行简单的 dom 遍历

例如考虑解析 pom.xml 文件: 例如考虑解析 pom.xml 文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>com.parent</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>2.0.0</modelVersion> <groupId>com.parent.somemodule</groupId> <artifactId>some_module</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Some Module</name> ... 代码: import xml.etree.ElementTree as ET tree = ET.parse(pom) root = tree.getroot() groupId = root.find("groupId") artifactId = root.find("artifactId") groupId和artifactId都是None。为什么他们是根的直系后代?我尝试用 root (tree) 替换 groupId = tree.find("groupId"),但这并没有改变任何东西。 问题是你没有有一个名为groupId的孩子,你有一个名为{http://maven.apache.org/POM/4.0.0}groupId的孩子,因为etree不会忽略XML名称空间,它使用“通用名称”。请参阅 effbot 文档中的使用命名空间和限定名称。 为了扩展 abarnert 对 BeautifulSoup 的评论,如果你确实只是想要一个快速而肮脏的解决方案来解决问题,这可能是最快的方法。我已经实现了这个(用于个人脚本),它使用 bs4,您可以使用 遍历树 element = dom.getElementsByTagNameNS('*','elementname') 这将使用任何名称空间引用 dom,如果您知道文件中只有一个名称空间,那么这会很方便,因此不会产生歧义。

回答 2 投票 0

使用 Python Elementree 访问 XMLNS 属性?

如何通过ElementTree访问NS属性? 具有以下内容: ...

回答 3 投票 0

在 .svg xml 中按 ID 选择元素

我使用 Inkscape 生成 .svg 图像(这是一个 xml 文件)。我将节点的 ID 设置为“mount-arm-r”。我想从该元素读取属性“x”、“y”。我似乎无法选择矩形元素。

回答 2 投票 0

Python:ElementTree,获取Element的命名空间字符串

此 XML 文件名为 example.xml: 此 XML 文件名为 example.xml: <?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>14.0.0</modelVersion> <groupId>.com.foobar.flubber</groupId> <artifactId>uberportalconf</artifactId> <version>13-SNAPSHOT</version> <packaging>pom</packaging> <name>Environment for UberPortalConf</name> <description>This is the description</description> <properties> <birduberportal.version>11</birduberportal.version> <promotiondevice.version>9</promotiondevice.version> <foobarportal.version>6</foobarportal.version> <eventuberdevice.version>2</eventuberdevice.version> </properties> <!-- A lot more here, but as it is irrelevant for the problem I have removed it --> </project> 如果我加载 example.xml 并使用 ElementTree 解析它,我可以看到它的命名空间是 http://maven.apache.org/POM/4.0.0。 >>> from xml.etree import ElementTree >>> tree = ElementTree.parse('example.xml') >>> print tree.getroot() <Element '{http://maven.apache.org/POM/4.0.0}project' at 0x26ee0f0> 我还没有找到一种方法可以调用来从 Element 获取名称空间,而不需要解析元素的 str(an_element)。看来必须有更好的方法了。 对于正则表达式来说,这是一个完美的任务。 import re def namespace(element): m = re.match(r'\{.*\}', element.tag) return m.group(0) if m else '' 命名空间应位于“实际”标签之前的 Element.tag 中: >>> root = tree.getroot() >>> root.tag '{http://maven.apache.org/POM/4.0.0}project' 要了解有关命名空间的更多信息,请查看 ElementTree:使用命名空间和限定名称。 我不确定这是否可以用 xml.etree 实现,但这里是你如何用 lxml.etree 做到这一点: >>> from lxml import etree >>> tree = etree.parse('example.xml') >>> tree.xpath('namespace-uri(.)') 'http://maven.apache.org/POM/4.0.0' 不使用正则表达式: >>> root <Element '{http://www.google.com/schemas/sitemap/0.84}urlset' at 0x2f7cc10> >>> root.tag.split('}')[0].strip('{') 'http://www.google.com/schemas/sitemap/0.84' lxml.xtree库的元素有一个名为nsmap的字典,它显示了当前标签范围内使用的所有命名空间。 >>> item = tree.getroot().iter().next() >>> item.nsmap {'md': 'urn:oasis:names:tc:SAML:2.0:metadata'} 简短的回答是: ElementTree._namspace_map[ElementTree._namspace_map.values().index('')] 但前提是您一直在打电话 ElementTree.register_namespace(prefix,uri) 响应迭代 结果时收到的每个 event=="start-ns" ET.iterparse(...) 并且您注册了 “start-ns” 回答“默认命名空间是什么?”这个问题,需要澄清两点: (1) XML 规范规定,默认命名空间不一定在整个树中是全局的,而是可以在根下的任何元素处重新声明默认命名空间,并向下继承,直到遇到另一个默认命名空间重新声明。 (2) ElementTree 模块(事实上)可以处理没有根默认命名空间的类 XML 文档,前提是它们在文档中的任何位置都没有使用命名空间。 (* 条件可能不太严格,例如,是“if”,不一定是“iff”)。 也许还值得考虑“你想要它做什么?”请考虑 XML 文件在语义上可能是等效的,但在语法上却截然不同。例如,以下三个文件在语义上是等效的,但 A.xml 有一个默认名称空间声明,B.xml 有 3 个,而 C.xml 没有。 A.xml: <a xlmns="http://A" xlmns:nsB0="http://B0" xlmns:nsB1="http://B1"> <nsB0:b/> <nsB1:b/> </a> B.xml: <a xlmns="http://A"> <b xlmns="http://B0"/> <b xlmns="http://B1"/> </a> C.xml: <{http://A}a> <{http://B0}b/> <{http://B1}b/> </a> 文件 C.xml 是提供给 ElementTree 搜索功能的规范扩展语法表示。 如果您事先确定不会出现命名空间冲突,则可以在解析时修改元素标签,如下所述:Python ElementTree 模块:如何在使用“find”方法时忽略 XML 文件的命名空间来定位匹配元素”、“找到所有” 我觉得看一下属性会更容易: >>> root.attrib {'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': 'http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'} 结合上面的一些答案,我认为最短的代码是 theroot = tree.getroot() theroot.attrib[theroot.keys()[0]] 这是我在 ElementTree 3.9+ 上的解决方案, def get_element_namespaces(filename, element): namespace = [] for key, value in ET.iterparse(filename, events=['start', 'start-ns']): print(key, value) if key == 'start-ns': namespace.append(value) else: if ET.tostring(element) == ET.tostring(value): return namespace namespace = [] return namespaces 这将返回一个 [prefix:URL] 元组数组,如下所示: [('android', 'http://schemas.android.com/apk/res/android'), ('tools', 'http://schemas.android.com/tools')]

回答 9 投票 0

在ElementTree中添加前缀属性

我正在 ElementTree 中操作 SVG 文件。给定文件 test.svg 我正在 ElementTree 中操作 SVG 文件。给定文件test.svg <?xml version='1.0' encoding='utf-8'?> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> </svg> 我尝试创建一个具有特定前缀的元素 import xml.etree.ElementTree as ET ET.register_namespace("", "http://www.w3.org/2000/svg") tree = ET.parse('test.svg') tree.getroot().set("xmlns:xlink", "http://www.w3.org/1999/xlink") link = ET.fromstring('<a xlink:href="http://www.example.com/"></a>') tree.write('worldMap/test_out.svg', encoding = 'utf-8', xml_declaration = True) 但是遇到了unbound prefix错误。我已经浏览了本教程,但不太明白出了什么问题。 您还必须在使用 xlink: 解析的字符串中声明 fromstring link = ET.fromstring('<a xmlns:xlink="http://www.w3.org/1999/xlink" ' 'xlink:href="http://www.mysite.com/"></a>')

回答 1 投票 0

使用 (X)HTML 实体解析 XML

尝试使用 ElementTree 解析包含未定义实体(即 )的 XML 会引发: 解析错误:未定义的实体 在 Python 2.x 中,可以通过创建解析器来更新 XML 实体字典(

回答 3 投票 0

从 xml 生成 spacy 的 TRAIN_DATA

我有xml数据,如下所示: 斯图加特 我有 xml 数据,如下所示: <item n="main"><anchor type="b" ana="regO.lemID_12" xml:id="TidB13" />Stuttgart<anchor type="e" ana="reg0.lemID_12" xml:id="TidE13" /> d. 20. Sept [19]97<lb/>Lieber Herr Schmidt!<lb/>Ich bin sehr glücklich über die Aufnahme <anchor type="b" ana="regW.lemID_17" xml:id="TidB22" />meines <anchor type="b" ana="regP.lemID_4" xml:id="TidB4" />Shakespeare<anchor type="e" ana="regP.lemID_4" xml:id="TidE4" /><anchor type="e" ana="regW.lemID_17" xml:id="TidE22" /> bei euch, vielen Dank.</item> 我想使用这样的文本作为spacy中的训练数据,因此我需要它以spacy requieres的形式: doc = nlp("Laura flew to Silicon Valley.") gold_dict = {"entities": [(0, 5, "PERSON"), (14, 28, "LOC")]} example = Example.from_dict(doc, gold_dict) 尤其是偏移量的创建,即实体何时开始和何时结束,我仍然无法正确理解。有没有特别合适的程序? 提前非常感谢您 我尝试用元素Tree来做到这一点,但是开始和结束位置的创建总是错误的。我也尝试用木瓜来做这件事,描述如下这里。但总是找不到“伊藤” 要 grep 文本,您需要元素 .tail: import xml.etree.ElementTree as ET xml_str =""" <item n="main"><anchor type="b" ana="regO.lemID_12" xml:id="TidB13" />Stuttgart<anchor type="e" ana="reg0.lemID_12" xml:id="TidE13" /> d. 20. Sept [19]97<lb/>Lieber Herr Schmidt!<lb/>Ich bin sehr glücklich über die Aufnahme <anchor type="b" ana="regW.lemID_17" xml:id="TidB22" />meines <anchor type="b" ana="regP.lemID_4" xml:id="TidB4" />Shakespeare<anchor type="e" ana="regP.lemID_4" xml:id="TidE4" /><anchor type="e" ana="regW.lemID_17" xml:id="TidE22" /> bei euch, vielen Dank.</item> """ root = ET.fromstring(xml_str) text = [] for elem in root.iter(): if elem.tail is not None: # with linebreak \n text.append(elem.tail+'\n') t = ''.join(text) print(t) print(repr(t)) 输出: Stuttgart d. 20. Sept [19]97 Lieber Herr Schmidt! Ich bin sehr glücklich über die Aufnahme meines Shakespeare bei euch, vielen Dank. 'Stuttgart\n d. 20. Sept [19]97\nLieber Herr Schmidt!\nIch bin sehr glücklich über die Aufnahme \nmeines \nShakespeare\n bei euch, vielen Dank.\n'

回答 1 投票 0

获取多级第一个子XML元素

我想要获取 XML 文档的第一个子级(不知道节点的确切名称),多层深度。 我正在将一些代码从 JS 移植到 Python。这是 JS 代码: 让文档 = XmlSer...

回答 1 投票 0

‘/xad’出现在Python代码中的字符串列表中

首先,我是一个初学者,刚刚接触Python中级,所以请耐心等待我解决这个问题的方法。我正在使用 lxml etree 和请求开发一个网络抓取迷你项目......

回答 1 投票 0

由于 xmlns 和 xsi,使用 ElementTree 读取 XML 时出现问题

我正在使用 python 和 ElementTree 读取 XML,并且正在努力处理 xmlns 和 xsi 标签。 我的 XML 的顶部如下所示。 我正在使用 python 和 ElementTree 读取 XML,并且正在努力处理 xmlns 和 xsi 标签。 我的 XML 顶部如下所示。 <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="website"?> <SurveyGroup xmlns:xsi="website2" xmlns:xsd="website3" xsi:schemaLocation="website4 website5" xmlns="website6"> <Survey> <Header> 我遵循 ET 流程 tree = ET.parse(xmlfile) root = tree.getroot() 问题是 xlmns 或 xsi 数据似乎与此相关。我无法访问作为该根的子元素的元素,如果我打印 root 我得到 <Element '{website}SurveyGroup' at 0x00000278FCC85120> 如果我将行更改为<SurveyGroup>,我就不会遇到这个问题。 XML 文档中的所有元素都存在于特定的命名空间中——要么应用特定的前缀(如 xsi:schemaLocation),要么对于没有命名空间前缀的元素,使用默认的 website6 命名空间(由 xmlns=website6 设置) 注释)。 如果要查找该文档中的元素,则需要指定适当的命名空间。有几种方法可以做到这一点。您可以将名称空间直接包含在大括号中,如下所示: >>> doc.findall('{website6}Survey') [<Element '{website6}Survey' at 0x7f02b45699e0>] 您还可以通过命名空间前缀引用命名空间: >>> namespaces={'foo': 'website6'} >>> doc.findall('foo:Survey', namespaces=namespaces) [<Element '{website6}Survey' at 0x7f02b45699e0>] 在这里,我们将前缀 foo 映射到 website6 命名空间,因此我们可以在元素名称上使用 foo: 前缀。 您可以通过使用空键向 namespaces 字典添加条目来在查询中设置默认命名空间: >>> namespaces={'': 'website6'} >>> doc.findall('Survey', namespaces=namespaces) [<Element '{website6}Survey' at 0x7f02b45699e0>]

回答 1 投票 0

我在 xml 中的每一行前面收到一个字节类型,我已经修剪了该字节类型,但是任何解析器都无法读取该 xml。如何解析pmc xml?

我正在尝试提取与搜索查询匹配的整个PMC全文文章,然后我得到IDList。然后 IDList 被传递到 Efetch 中以获得响应。 响应格式是...

回答 1 投票 0

如何使用python将geopandas数据写入osm.pbf文件?

我有样本节点、边缘数据,如下所示。我正在使用 ElementTree 将数据写入 .osm 文件,然后尝试使用渗透转换为 .osm.pbf,但是当尝试从 .osm 转换为 .o 时...

回答 1 投票 0

xml.etree.ElementTree 上的缩进功能不一致

代码的目的是将 XML 块插入到 XML 基本结构中以创建最终的 XML 输出。 导入 xml.etree.ElementTree 作为 ET 从 xml.etree.ElementTree 导入 XMLParser 基础树...

回答 1 投票 0

使用“ElementTree”库将给定表达式替换为 XML 文件中的值后打印数据

给定的 XML 文件片段是: 给定的 XML 文件片段是: <?xml version="1.0" standalone="yes"?> <event_configuration family="21" version="2"> <pqr subtype="abc"> <event val="73002" name="$MyCpu"> </event> <event val="73003" name="$MyCpuKernel"> </event> <metric name="Ratio" expression="$MyCpuKernel / $MyCpu"> </metric> </pqr> </event_configuration> 我已经使用Python中的“ElementTree”库解析了这个xml文件,请找到下面的代码: def parse_xml_to_json(self): data = {'metric': []} root = ET.fromstring(self.xml_file) for element in root.findall('.//*'): element_type = element.tag if element_type not in ["pqr", "stu", "vwx"]: continue subtype_name = element.attrib['subtype'] event_map = {} for event in element.findall('.//event'): event_name = event.attrib['name'] val_value = event.attrib['val'] event_map[event_name] = val_value for metric in element.findall('metric'): expression = metric.attrib['expression'] metric_name = metric.attrib['name'] for event_name, val_value in event_map.items(): expression = expression.replace(event_name, val_value) data['metric'].append({ 'Name': metric_name, 'Expression': expression, 'Type': element_type }) return data 我正在获取输出,但此代码无法将“Expression”中存在的事件名称替换为 val_value,如下所示:- 输出: { "metric": [ { "Name": "Ratio", "Expression": "73002Kernel / 73002", "Type": "pqr" }, .... .... ] } 在这里,我们可以在“表达式”中看到它应该打印“73003 / 73002”。 我无法想到如何解决这个问题。这里可以使用正则表达式吗?如何应用它?请推荐。 您可以更改 XML 并创建 JSON: import xml.etree.ElementTree as ET import pprint tree = ET.parse("eventConfig.xml") root = tree.getroot() # Find the values mycpu = root.find(".//event[@name = '$MyCpu']").get('val') mycpukernel = root.find(".//event[@name = '$MyCpuKernel']").get('val') # Create the new attribute value for expression with a f-string tex = f"{mycpu}/{mycpukernel}" # Set the new attribute value metric = root.find(".//metric[@expression]").set('expression', tex) ET.dump(root) 输出: <event_configuration family="21" version="2"> <pqr subtype="abc"> <event val="73002" name="$MyCpu" /> <event val="73003" name="$MyCpuKernel" /> <metric name="Ratio" expression="73002/73003" /> </pqr> </event_configuration>

回答 1 投票 0

在将其作为请求发送之前重写 SOAP xml

我需要在发出请求之前重写 SOAP XML 文件。 我可以使用静态文件发送请求并接收响应,没有任何问题,但我需要更改一些值 我尝试使用 ElementT...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.