看起来原来的帖子太模糊了,所以我正在缩小这篇文章的重点。我有一个XML文件,我想从特定分支中提取值,并且我很难理解如何有效地导航XML路径。考虑下面的XML文件。有几个<mi>
分支。我想存储某些分支的价值<r>
,但不是其他分支。在这个例子中,我想要counter1和counter3的<r>
值,但不是counter2。Python3将XML解析为字典
<?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从的<r>
值取具有<mt>counter1</mt>
和7的<mi>
元素取自具有<mt>counter3</mt>
的<mi>
元素。
我想使用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'没有排序。根据您的绘图软件,您可能需要维护两个并行列表或可能是用于排序的元组列表。 – tdelaney
...以及一个人如何绘制计数器名称。你想要值吗? –
tdelaney
我已经尝试了几件事情,但大多数时候我甚至不知道如何在Python中进行操作。我会试着发布一些迄今为止我所做的。是的,我想绘制r值。并感谢您对替代方法的建议。这就是为什么我包含了关于想要绘制这些信息的原因。我不确定我是否正确地使用词典来解决这个问题。如果你可以发表一些关于如何使用元组的细节,我会非常感激。 –