![](/img/trans.png)
[英]Parsing XML in python. Get all child node values inside selected node
[英]Parsing xml in python to get all child elements
我已經解析了一個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
)的名稱空間部分。 AFAIK ElementTree
沒有方法僅返回本地名稱 。 所以,你必須
lxml.etree
而不是xml.etree.ElementTree
並在每個元素上應用xpath('local-name()')
, 因此,鑒於此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>]
現在,元素本身不帶有名稱空間。 因此,您不必再剝離它。
您可以將XSLT與xsltproc
一起使用,則無需更改程序。 另外,您可以在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.