XML属性搜索Python

时间:2014-11-04 01:21:44

标签: python xml parsing

所以我正在运行以XML格式输出的第三方程序....这是我感兴趣的XML部分:

<something>
    <process>
      <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/>
      <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/>
      <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/>
      <iteration number="3" value ="75.885" delta ="0.22523" nu ="0.49176" rho ="0.19133" x="0.44226" max_f_grad="2.8594" max_greyness_grad="0"/>
      <iteration number="4" value ="68.869" delta ="0.21915" nu ="0.49569" rho ="0.21463" x="0.43686" max_f_grad="2.8433" max_greyness_grad="0"/>
      <iteration number="5" value ="64.864" delta ="0.2238" nu ="0.49721" rho ="0.22948" x ="0.43071" max_f_grad="2.8375" max_greyness_grad="0"/>
...........
............
    </process>
<something>

现在我得到&#34;迭代次数&#34;的值在我的python脚本中的变量中说it=200并想要找到相应的delta和value ....我如何在python中做到这一点我是初学者。

3 个答案:

答案 0 :(得分:0)

如果您使用的是xml.elementtree.Etree,则可以使用以下代码获取任何valuedelta属性的值:

values_list = []
deltas_list = []
for iteration in root.findall(".//process/iteration"):
    values_list.add(iteration.attrib["value"])
    deltas_list.add(iteration.attrib["delta"])

如果您确实想对从valuedelta属性中获取的值执行某些操作,只需将print语句切换为将这些值分配给在迭代之外仍然存在的对象。

这将遍历根元素<process>中的所有<something>元素,并在其中迭代每个<iteration>元素中包含的所有<process>元素。

编辑:如果我误解了您的问题,您想要的是仅保存 值元素中valuedelta属性的值属性number的属性为200

values = []
deltas = []
for two_hundred_iteration in root.findall(".//process/iteration[@number='200']"):
    values.append(two_hundred_iteration.attrib["value"])
    deltas.append(two_hundred_iteration.attrib["delta"])

请注意,此语法仅适用于ElementTree 1.3或更高版本,因此如果您使用的是Python 2.7或更低版​​本,则它将不适用于您。

答案 1 :(得分:0)

如何打印&#34;值&#34;对于具有数字=&#34; 200&#34;的迭代元素使用ElementTree:

for process in root.findall("process"):
  for iteration in process.findall("iteration"):
    if int(iteration["number"]) == 200:
      print iteration["value"]

请注意,ElementTree会将XML加载到内存中,因此对于非常大(〜千兆字节+)的文件来说它并不理想。

答案 2 :(得分:-1)

我建议你xmltodict

>>> doc = xmltodict.parse("""
... <something>
...     <process>
...         <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/>
...         <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/>
...         <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/>
...     </process>
... <something>
... """)
>>> doc["something"]["process"]["iteration"]
... [OrderedDict([(u'@max_f_grad', u'45.192'), (u'@number', u'0'), (u'@value', u'186.88'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.125'), (u'@delta', u'0.5'), (u'@x', u'0.4375'), (u'@nu', u'0.5')]), OrderedDict([(u'@max_f_grad', u'4.5908'), (u'@number', u'1'), (u'@value', u'125.89'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.1217'), (u'@delta', u'0.44955'), (u'@x', u'0.39894'), (u'@nu', u'0.46812')]), OrderedDict([(u'@max_f_grad', u'2.8968'), (u'@number', u'2'), (u'@value', u'90.528'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.15828'), (u'@delta', u'0.22576'), (u'@x', u'0.44465'), (u'@nu', u'0.48615')])]

使用这些数据,你可以看起来更好。

相关问题