Python XML解析器不返回XML元素

2024-09-30 20:17:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找到一种方法来使用Python解析几个.xml文件中的数据,这些文件包含我的团队正在开发的系统的部件号和描述。以下是这些文件的外观:

注:出于保密原因,实际数据已被清理

<DOCUMENT>
<config>
<lruname>NFS</lruname>
<swpn>123-A-456-7890</swpn>
<swname>00 NFS ABC DEFGHI XYZ JKL</swname>
<swver>Appid: abc-defghi-xyz  PN: 123-A-456-7890</swver>
</config>
</DOCUMENT>

我想把这些文件中的和数据类型转换成.csv格式。我最初的想法是尝试使用内置的xml.etree库将这些数据类型解析到字典中,但由于某些原因,它找不到元素:

import xml.etree.ElementTree as ET

data = '''
<DOCUMENT>
<config>
<lruname>NFS</lruname>
<swpn>123-A-456-7890</swpn>
<swname>00 NFS ABC DEFGHI XYZ JKL</swname>
<swver>Appid: abc-defghi-xyz  PN: 123-A-456-7890</swver>
</config>
</DOCUMENT>
'''

tree = ET.fromstring(data)
PartNo = tree.find('swpn')
Desc = tree.find('swname')

print(PartNo)

出于某种原因,上面的代码返回“None”,但我希望它返回我正在调用的xml元素


Tags: 文件数据configtree原因xmldocumentabc
2条回答

ElementTreeetree的查找直接子级的功能搜索器

您仍然可以通过指定整个分支来使用它:

tree.find('config').find('swpn')
tree.find('config/swpn')

如果您总是想查找swpn,但忽略结构(例如,您不知道它是否将是config的子级),您可能会发现在etree(而不是在ElementTree)中使用xpath功能更容易:

tree = etree.fromstring(data)
tree.xpath('//swpn')

在本例中,//基本上意味着您正在tree中查找元素,不管它们在哪里

如果xml文件很小,并且您不关心性能,那么可以使用minidom,这比lxml更方便。在这种情况下,您的代码可以是这样的:

from xml.dom.minidom import parseString
xml = parseString(data)
PartNo = xml.getElementsByTagName('swpn')[0]
Desc = xml.getElementsByTagName('swname')[0]
print(PartNo.firstChild.nodeValue)

我认为您缺少XML层次结构中的config级别,您可以这样做:

part_number = tree.find('config').find('swpn').text
part_desc = tree.find('config').find('swname').text

或者,如果您不想知道结构,您可以遍历所有元素,并使用条件来查找您所关心的tree.iter元素

for e in tree.iter():
    if e.tag == 'sqpn':
        part_number = e.text
    if e.tag == 'swname':
        part_desc = e.text

相关问题 更多 >