ElementTree是一个用于创建和解析XML的Python库。
xml.etree.Elementree Python 3 解析器在 xml 中循环多个层时不起作用
美化后的数据串: ...
使用 BeautifulSoup 或 Elementtree 将 XML 嵌套到数据框
我有一个代表产品交易的 XML 文件。我想将此数据转换为 pandas 数据框,但不知道如何迭代以获取所有产品级别数据。 这是一个...
根据预定义的 XML 结构,为 Excel 工作表中的每一行创建一个 XML 文件
我有以下 XML 文件,希望从 Excel 电子表格导入数据,并将其放置在某些元素(例如 eadid 和 titleproper)之间。我已经尝试过附加的Python代码,但是这个
在Python中使用signxml生成和验证签名时出现问题(命名空间和签名)
首先抱歉我的英语。我正在Python中使用signxml迈出第一步,从我看到的文章来看,它看起来很容易使用,但我无法正确签署文档,因为我
我正在编写一个python脚本,其目标是在匹配给定条件时更改xml标签的值:在这里,如果id是“皮卡丘”,我想将活动标签从true更改为false 当我...
我正在 python 中通过元素树解析 XML 文件,并将内容写入 cpp 文件。 不同标签的子标签内容会有所不同。例如,第一个事件标签具有标准...
我使用 python 和 xml.etree.ElementTree 来构建 xml 文件。但只有基础树有超过 350 行,我想将其放在一个单独的文件中。我怎么做? 我的代码: 导入 xml...
我想在 ElementTree 中设置属性的命名空间以获得以下结果。 我已经注册了名字...
使用 ELEMNTREE 和 Beautifulsoup 解析 XML 时面临内存问题
我正在尝试使用 beautifulsoup 和 elementree 解析和 XML,但它导致我的电脑崩溃,因为 XML 文件大小为 15,98,040KB,是否可以解析这么大的文件???或任何
Python etree 解析 html 文本失败(返回 NoneType)
为什么输出为“None”?它应该像“”或其他东西。 注意:仅在我的 Mac 上出现问题。我尝试过使用 p...
我想从给定的 XML 中更新下面提到的 2 个子子元素的值。 语言首选项__GET.jtl 我想从给定的 XML 更新下面提到的 2 个子子元素的值。 语言首选项__GET.jtl 假 </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>false</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>false</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>true</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <hostname>true</hostname> <threadCounts>true</threadCounts> <sampleCount>true</sampleCount> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>false</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>true</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename">language-preferences__GET.jtl</stringProp> </ResultCollector> <hashTree/> 我编写了下面的代码来访问 ResultCollector 的子元素。但是,我无法找出浏览多个子子元素的更好方法。 tree = ET.parse(jmx_path) aggregate_samplers = tree.findall('.//ResultCollector[@testname="Aggregate Report"]') active_aggregate_samplers = [active_aggregate_sampler for active_aggregate_sampler in aggregate_samplers if active_aggregate_sampler.attrib['enabled'] == 'true'] for active_sampler in active_aggregate_samplers: for child in active_sampler: if child.tag == 'objProp': # < update **subresults** value as true> elif child.attrib['name'] == 'filename': child.text = str(uuid.uuid4()) + '_' + child.text // new file name # < update **filename** value as c82fa39b-5079-4838-b17c-fdf85f49fd5f_language-preferences__GET.jtl> 注意: 您的示例 xml 片段没有根元素! 答案: 如果 xml 已更正,您可以使用 findall() 找到您感兴趣的标签列表。然后更改相关列表元素的文本内容: import xml.etree.ElementTree as ET tree = ET.parse("hashTree.xml") root = tree.getroot() subres_list = root.findall(".//subresults") for sub in subres_list: sub.text = "true" # your new text for the list elements stringP_list = root.findall(".//stringProp") for stringP in stringP_list: stringP.text = "c82fa39b-5079-4838-b17c-fdf85f49fd5f_language-preferences__GET.jt"
我想根据某些标准将子元素从一棵树替换到另一棵树。我可以使用理解来做到这一点吗?但是我们如何替换ElementTree中的元素呢?
有没有办法从 xml 文件中删除所有出现的具有特定属性的特定元素?
我有一堆 xml 文件,我想从中删除一个名为 uid 且属性 type = uri 的元素。还有元素 uid 的其他实例,但我只想删除带有 ...
我在从 xml 文件中提取文本时遇到问题,但我的代码不允许我获得我期望获得的内容。 这是代码的一部分。 根 = etree.fromstring(xml) 标题 = root.findall('
ElementTree:使用 findall 提取属性值并将值附加到列表
想要从内部标签中提取名称属性的值,并且如果存在组值,则将组名称附加到名称标签。我尝试使用 xml.etree.ElementTree 提取,但我的代码......
我已经解析了一个 XML 文件以获取其所有元素。我得到以下输出 [, 我已经解析了一个 XML 文件以获取其所有元素。我得到以下输出 [<Element '{urn:mitel:params:xml:ns:yang:vld}vld-list' at 0x0000000003059188>, <Element '{urn:mitel:params:xml:ns:yang:vld}vl-id' at 0x00000000030689F8>, <Element '{urn:mitel:params:xml:ns:yang:vld}descriptor-version' at 0x0000000003068A48>] 我需要仅为列表的每个元素选择 } 和 ' 之间的值。 这是我到目前为止的代码: import xml.etree.ElementTree as ET tree = ET.parse('UMR_VLD01_OAM_V6-Provider_eth0.xml') root = tree.getroot() # all items print('\nAll item data:') for elem in root: all_descendants = list(elem.iter()) print(all_descendants) 我怎样才能实现这个目标? {}中的文本是 XML 元素的限定名称 (QName) 的命名空间部分。据我所知,ElementTree中没有方法只返回本地名称。所以,你必须要么 通过字符串处理提取名称的本地部分,正如在对您的问题的评论中已经提出的那样, 使用 lxml.etree 代替 xml.etree.ElementTree 并在每个元素上应用 xpath('local-name()'), 或者提供没有命名空间的 XML 源。您可以使用 XSLT 剥离名称空间。 因此,给定此 XML 输入: <?xml version="1.0" encoding="UTF-8"?> <foo xmlns="urn:mitel:params:xml:ns:yang:vld"> <bar> <baz x="1"/> <yet> <more> <nested/> </more> </yet> </bar> <bar/> </foo> 您只能使用此程序变体打印本地名称列表: import xml.etree.ElementTree as ET tree = ET.parse('UMR_VLD01_OAM_V6-Provider_eth0.xml') root = tree.getroot() # all items print('\nAll item data:') for elem in root: all_descendants = [e.tag.split('}', 1)[1] for e in elem.iter()] print(all_descendants) 输出: ['bar', 'baz', 'yet', 'more', 'nested'] ['bar'] 带有 lxml.etree 和 xpath('local-name()') 的版本如下所示: import lxml.etree as ET tree = ET.parse('UMR_VLD01_OAM_V6-Provider_eth0.xml') root = tree.getroot() # all items print('\nAll item data:') for elem in root: all_descendants = [e.xpath('local-name()') for e in elem.iter()] print(all_descendants) 输出与字符串处理版本相同。 要从输入中完全剥离名称空间,您可以应用此 XSLT: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet> 然后你的原始程序输出: [<Element 'bar' at 0x04583B40>, <Element 'baz' at 0x04583B70>, <Element 'yet' at 0x04583BD0>, <Element 'more' at 0x04583C30>, <Element 'nested' at 0x04583C90>] [<Element 'bar' at 0x04583CC0>] 现在元素本身不具有名称空间。所以,你不必再剥它了。 您可以使用 xsltproc 应用 XSLT,然后您无需更改程序。或者,您可以在 python 中应用 XSLT,但这也需要您使用 lxml.etree。因此,程序的最后一个变体如下所示: import lxml.etree as ET tree = ET.parse('UMR_VLD01_OAM_V6-Provider_eth0.xml') xslt = ET.parse('stripns.xslt') transform = ET.XSLT(xslt) tree = transform(tree) root = tree.getroot() # all items print('\nAll item data:') for elem in root: all_descendants = list(elem.iter()) print(all_descendants)
有没有办法使用elementtree更改具有相同标签但不同元素的XML元素
所以我有一个 XML,其中有多行出生日期,但元素不同。 例如,在我的 XML 中,我有以下几行: 1998年3月12日 所以我有一个 XML,其中有多行出生日期,但元素不同。 例如,在我的 XML 中,我有以下几行: <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>31-7-1941</date-of-birth> <date-of-birth>23-11-1965</date-of-birth> 我想将仅具有 DOB "12-3-1998" 的行更改为具有 DOB "14-11-2001" 并保持其他行不变,但我正在努力找出如何在不更改所有行或不更改任何行的情况下执行此操作。 我尝试这样做: import xml.etree.ElementTree as ET xml_tree = ET.parse(TestXML.xml) root = xml_tree.getroot() for DOB in root.findall(".//{*}12-3-1998"): DOB.text = "14-11-2001" ET.tostring(root) 但是我的root.findall(".//{*}12-3-1998")没有找到任何东西,所以我所有的出生日期都保持不变 我尝试执行以下操作,但它更改了我的所有 DOB 元素,而我只想更改具有“12-3-1998”的元素: import xml.etree.ElementTree as ET xml_tree = ET.parse(TestXML.xml) root = xml_tree.getroot() for DOB in root.findall(".//{*}date-of-birth"): DOB.text = "14-11-2001" ET.tostring(root) 所以我想知道是否有一种方法可以过滤我想要更改的特定 DOB 是否使用 elementtree 和/或另一个 Python 库? IIUC,你可以这样做: import xml.etree.ElementTree as ET data = """ <data> <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>12-3-1998</date-of-birth> <date-of-birth>31-7-1941</date-of-birth> <date-of-birth>23-11-1965</date-of-birth> </data> """ root = ET.fromstring(data) for dob in root.findall("date-of-birth"): if dob.text == "12-3-1998": dob.text = "14-11-2001" print(ET.tostring(root).decode("utf-8")) 打印: <data> <date-of-birth>14-11-2001</date-of-birth> <date-of-birth>14-11-2001</date-of-birth> <date-of-birth>14-11-2001</date-of-birth> <date-of-birth>31-7-1941</date-of-birth> <date-of-birth>23-11-1965</date-of-birth> </data>
使用Python ElementTree解析XML以提取特定数据
我有一个需要解析的xml文件。我对python和xml的理解比较模糊。我正在使用 ElementTree 来解析文档,但是我在网上研究过的几乎所有参考文献都让我开始了解...
我正在尝试解析从网络检索的 XML 文档,但解析后崩溃并出现以下错误: ': 加载外部实体失败“ 我正在尝试解析从网络检索的 XML 文档,但解析后出现此错误,它崩溃了: ': failed to load external entity "<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="GreenButtonDataStyleSheet.xslt"?> 这是下载的 XML 中的第二行。有没有办法阻止解析器尝试加载外部实体,或者有其他方法来解决这个问题?这是我到目前为止的代码: import urllib2 import lxml.etree as etree file = urllib2.urlopen("http://www.greenbuttondata.org/data/15MinLP_15Days.xml") data = file.read() file.close() tree = etree.parse(data) 与 mzjn 所说的一致,如果你确实想将字符串传递给 etree.parse(),只需将其包装在 StringIO 对象中即可。 示例(python2): from lxml import etree from StringIO import StringIO myString = "<html><p>blah blah blah</p></html>" tree = etree.parse(StringIO(myString)) 示例 (python3) 从 io 而不是 StringIO 导入: from lxml import etree from io import StringIO myString = "<html><p>blah blah blah</p></html>" tree = etree.parse(StringIO(myString)) 此方法在lxml文档中使用。 etree.parse(source)预计source成为其中之一 文件名/路径 文件对象 类似文件的对象 使用 HTTP 或 FTP 协议的 URL 问题在于您以字符串形式提供 XML 内容。 您也可以不使用urllib2.urlopen()。只需使用 tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml") 演示(使用lxml 2.3.4): >>> from lxml import etree >>> tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml") >>> tree.getroot() <Element {http://www.w3.org/2005/Atom}feed at 0xedaa08> >>> 在竞争答案中,建议lxml失败,因为文档中的处理指令引用了样式表。但这不是这里的问题。 lxml 不会尝试加载样式表,并且如果按照上述操作,XML 文档就可以很好地解析。 如果你想实际加载样式表,你必须明确它。需要这样的东西: from lxml import etree tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml") # Create an _XSLTProcessingInstruction object pi = tree.xpath("//processing-instruction()")[0] # Parse the stylesheet and return an ElementTree xsl = pi.parseXSL() 用于解析的 lxml 文档说 要从字符串解析,请使用 fromstring() 函数。 parse(...) parse(source, parser=None, base_url=None) Return an ElementTree object loaded with source elements. If no parser is provided as second argument, the default parser is used. The ``source`` can be any of the following: - a file name/path - a file object - a file-like object - a URL using the HTTP or FTP protocol To parse from a string, use the ``fromstring()`` function instead. Note that it is generally faster to parse from a file path or URL than from an open file object or file-like object. Transparent decompression from gzip compressed sources is supported (unless explicitly disabled in libxml2). 您收到该错误是因为您正在加载的 XML 引用了外部资源: <?xml-stylesheet type="text/xsl" href="GreenButtonDataStyleSheet.xslt"?> LXML 不知道如何解析 GreenButtonDataStyleSheet.xslt。你和我可能意识到,它将相对于你的原始 URL 可用,http://www.greenbuttondata.org/data/15MinLP_15Days.xml...诀窍是告诉 lxml 如何加载它。 lxml 文档 包含标题为“文档加载和 URL 解析”的部分,其中几乎包含您需要的所有信息。