ElementTree是一个用于创建和解析XML的Python库。
我查看了有关此问题的其他问题,但没有一个对我有帮助。我正在使用 ElementTree 解析 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>
我在 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 元素; ...
在 Python 中重新组合 root.findall(".//") 中的元素
我正在将 BytesIO SVG 数据解析为元素树。我从以下内容开始: 树 = ET.parse(svg) 根 = 树.getroot() 根在哪里: ...
Python:xml ElementTree(或 lxml)中的命名空间
我想检索旧版 xml 文件,操作并保存它。 这是我的代码: 从 xml.etree 导入 cElementTree 作为 ET NS =“{http://www.somedomain.com/XI/Traffic/10}” def fix_xml(文件名): ...
使用 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,如果您知道文件中只有一个名称空间,那么这会很方便,因此不会产生歧义。
使用 Python Elementree 访问 XMLNS 属性?
如何通过ElementTree访问NS属性? 具有以下内容: ...
我使用 Inkscape 生成 .svg 图像(这是一个 xml 文件)。我将节点的 ID 设置为“mount-arm-r”。我想从该元素读取属性“x”、“y”。我似乎无法选择矩形元素。
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')]
我正在 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>')
尝试使用 ElementTree 解析包含未定义实体(即 )的 XML 会引发: 解析错误:未定义的实体 在 Python 2.x 中,可以通过创建解析器来更新 XML 实体字典(
我有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'
我想要获取 XML 文档的第一个子级(不知道节点的确切名称),多层深度。 我正在将一些代码从 JS 移植到 Python。这是 JS 代码: 让文档 = XmlSer...
首先,我是一个初学者,刚刚接触Python中级,所以请耐心等待我解决这个问题的方法。我正在使用 lxml etree 和请求开发一个网络抓取迷你项目......
由于 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>]
我在 xml 中的每一行前面收到一个字节类型,我已经修剪了该字节类型,但是任何解析器都无法读取该 xml。如何解析pmc xml?
我正在尝试提取与搜索查询匹配的整个PMC全文文章,然后我得到IDList。然后 IDList 被传递到 Efetch 中以获得响应。 响应格式是...
如何使用python将geopandas数据写入osm.pbf文件?
我有样本节点、边缘数据,如下所示。我正在使用 ElementTree 将数据写入 .osm 文件,然后尝试使用渗透转换为 .osm.pbf,但是当尝试从 .osm 转换为 .o 时...
xml.etree.ElementTree 上的缩进功能不一致
代码的目的是将 XML 块插入到 XML 基本结构中以创建最终的 XML 输出。 导入 xml.etree.ElementTree 作为 ET 从 xml.etree.ElementTree 导入 XMLParser 基础树...
使用“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>
我需要在发出请求之前重写 SOAP XML 文件。 我可以使用静态文件发送请求并接收响应,没有任何问题,但我需要更改一些值 我尝试使用 ElementT...