使用 Python 解析带有命名空间的 XML 文件
Parse XML file with namespace with Python
我有一个复杂的 xml 我正在尝试从中提取数据。
<?xml version="1.0" ?>
<root xmlns="something.something.com">
<Save>
<AdditionalInfo>
<Name></Name>
<Time></Time>
<UtilityVersion></UtilityVersion>
<XMLVersion></XMLVersion>
<PluginName></PluginName>
<ClassName></ClassName>
</AdditionalInfo>
<Data>
<session>
<xyDataObjects>
<xyData Key="'info'" ObjectType="moreinfo" Type="evenmoreinfo">
<axis1QuantityType ObjectType="guesswhat" Type="info!">
<label></label>
<type></type>
</axis1QuantityType>
... and so on and so on
该文件有多个以保存和/保存块开始和结束的块,我要查找的信息可以与标签一样远,甚至更远。
ElementTree.Iter 似乎是我的解决方案,因为它会遍历每个保存块并找到我正在寻找的 <label>
信息,但不幸的是,它不接受命名空间参数。
我还有哪些其他选择?我试图保持我的代码灵活,因为我预见 xml 文件的结构将来可能会改变,而且很简单,所以我宁愿不实现类似的东西:
tree= ET.parse('dblank.xml')
root = tree.getroot()
for i in range(len(root)):
Array[i]=root[i][1][0][0][0][0][0].text
当您使用命名空间处理 XML 时,您必须指定使用的命名空间。
为此本人:
- 定义了 ns 变量(字典),以名称空间快捷方式作为键
和完整的命名空间作为值(这里是一个字典条目),
- 使用此变量作为 findall.
中的第二个参数
另请注意,findall 的第一个参数包含 some: 作为
元素名称的初始部分。
试试下面的代码:
import xml.etree.ElementTree as et
tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'some': 'something.something.com'}
for elem in root.findall('.//some:label', ns):
print(elem.text)
当然,这只是一个如何引用现有元素的例子。
根据您的需要进行更改。
我有一个复杂的 xml 我正在尝试从中提取数据。
<?xml version="1.0" ?>
<root xmlns="something.something.com">
<Save>
<AdditionalInfo>
<Name></Name>
<Time></Time>
<UtilityVersion></UtilityVersion>
<XMLVersion></XMLVersion>
<PluginName></PluginName>
<ClassName></ClassName>
</AdditionalInfo>
<Data>
<session>
<xyDataObjects>
<xyData Key="'info'" ObjectType="moreinfo" Type="evenmoreinfo">
<axis1QuantityType ObjectType="guesswhat" Type="info!">
<label></label>
<type></type>
</axis1QuantityType>
... and so on and so on
该文件有多个以保存和/保存块开始和结束的块,我要查找的信息可以与标签一样远,甚至更远。
ElementTree.Iter 似乎是我的解决方案,因为它会遍历每个保存块并找到我正在寻找的 <label>
信息,但不幸的是,它不接受命名空间参数。
我还有哪些其他选择?我试图保持我的代码灵活,因为我预见 xml 文件的结构将来可能会改变,而且很简单,所以我宁愿不实现类似的东西:
tree= ET.parse('dblank.xml')
root = tree.getroot()
for i in range(len(root)):
Array[i]=root[i][1][0][0][0][0][0].text
当您使用命名空间处理 XML 时,您必须指定使用的命名空间。 为此本人:
- 定义了 ns 变量(字典),以名称空间快捷方式作为键 和完整的命名空间作为值(这里是一个字典条目),
- 使用此变量作为 findall. 中的第二个参数
另请注意,findall 的第一个参数包含 some: 作为 元素名称的初始部分。
试试下面的代码:
import xml.etree.ElementTree as et
tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'some': 'something.something.com'}
for elem in root.findall('.//some:label', ns):
print(elem.text)
当然,这只是一个如何引用现有元素的例子。 根据您的需要进行更改。