XML属性搜索Python

2024-09-27 00:22:52 发布

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

所以我正在运行一个第三方程序,它以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>

现在我在python脚本中得到变量it=200中“iteration number”的值,并希望找到相应的delta和值….如何在python中做到这一点我是一个初学者。你知道吗


Tags: 程序脚本numbervaluexmlprocessmaxsomething
3条回答

我推荐你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')])]

有了这些数据你会看起来更好。你知道吗

如何使用ElementTree打印number=“200”的迭代元素的“值”:

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

请注意,ElementTree会将XML加载到内存中,因此对于非常大的(~gigabyte+)文件来说,它并不理想。你知道吗

如果你用的是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语句,将这些值赋给将在迭代之外持久存在的对象。你知道吗

它遍历根元素<something>中的所有<process>元素,并在其中遍历每个<process>元素中包含的所有<iteration>元素。你知道吗

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

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"])

请注意,此语法只适用于ElementTree1.3或更高版本,因此如果您使用的是Python2.7或更低版本,它将不适用于您。你知道吗

相关问题 更多 >

    热门问题