【发布时间】:2016-10-11 03:56:47
【问题描述】:
看来原帖太含糊了,所以我缩小了这篇文章的重点。我有一个 XML 文件,我想从中提取特定分支的值,但我很难理解如何有效地导航 XML 路径。考虑下面的 XML 文件。有几个<mi> 分支。我想存储某些分支的<r> 值,而不是其他分支。在此示例中,我想要 counter1 和 counter3 的 <r> 值,而不是 counter2。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Data.xsl" ?>
<!DOCTYPE mdc SYSTEM "Data.dtd">
<mdc xmlns:HTML="http://www.w3.org/TR/REC-xml">
<mfh>
<vn>TEST</vn>
<cbt>20140126234500.0+0000</cbt>
</mfh>
<mi>
<mts>20140126235000.0+0000</mts>
<mt>counter1</mt>
<mv>
<moid>DEFAULT</moid>
<r>58</r>
</mv>
</mi>
<mi>
<mts>20140126235000.0+0000</mts>
<mt>counter2</mt>
<mv>
<moid>DEFAULT</moid>
<r>100</r>
</mv>
</mi>
<mi>
<mts>20140126235000.0+0000</mts>
<mt>counter3</mt>
<mv>
<moid>DEFAULT</moid>
<r>7</r>
</mv>
</mi>
</mdc>
由此我想用以下内容构建一个元组:
('20140126234500.0+0000', 58, 7)
其中 20140126234500.0+0000 取自 <cbt>,58 取自 <mi> 元素的 <r> 值(具有 <mt>counter1</mt>),7 取自 <mi> 元素(具有 <mt>counter3</mt>)。
我想使用xml.etree.cElementTree,因为它似乎是标准的,并且应该能够满足我的目的。但是我在导航树和提取我需要的值时遇到了困难。以下是我尝试过的一些方法。
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
tree = ET.ElementTree(file='Data.xml')
root = tree.getroot()
for mi in root.iter('mi'):
print(mi.tag)
for mt in mi.findall("./mt") if mt.value == 'counter1':
print(mi.find("./mv/r").value) #I know this is invalid syntax, but it's what I want to do :)
从伪代码的角度来看,我想做的是:
find the <cbt> value and store it in the first position of the tuple.
find the <mi> element where <mt>counter1</mt> exists and store the <r> value in the second position of the tuple.
find the <mi> element where <mt>counter3</mt> exists and store the <r> value in the third position of the tuple.
我不清楚何时使用element.iter() 或element.findall()。此外,在函数中使用XPath 或提取我需要的信息时,我运气不佳。
谢谢, 生锈
【问题讨论】:
-
发布您尝试过的内容。顺便说一句,没有订购常规的
dict。根据您的绘图软件,您可能需要维护两个并行列表或用于排序的元组列表。 -
......无论如何,一个情节计数器名称如何。你想要
值吗? -
我已经尝试了几件事,但大多数情况下我什至不知道如何在 Python 中进行操作。我会尝试发布一些我到目前为止所做的事情。是的,我想绘制 r 值。并感谢有关替代方法的建议。这就是为什么我包含有关想要绘制它的信息的原因。我不确定我是否以正确的方式使用字典。如果您能发布一些有关如何使用元组的详细信息,我将不胜感激。
-
我更新了帖子以缩小焦点并按照 tdelaney 的建议合并元组而不是字典。
标签: python xml elementtree