【问题标题】:Issues while parsign an xml file with lxml module使用 lxml 模块分配 xml 文件时出现问题
【发布时间】:2014-12-09 13:22:13
【问题描述】:

我正在尝试遍历“variant”的所有“value”标签,代码不会跳转到下一个“value”键,因为 xml 在“FIRST VALUE KEY”下还有另一个“value”键

<variant>
  <name>PROGRAMS</name>
  <value>  <!-- Lets call it FIRST VALUE KEY -->
     <value>PROG1</value>
     <statistics>
        <statistic name="Stats">
           <value>5</value>
        </statistic>
     </statistics>
  </value>
  <value>  <!-- SECOND VALUE KEY -->
     <value>PROG2</value>
     ...
  </value>
</variant>
<variant>
  <name>OTHER</name>
   ...
</variant>

这是我的python代码

for keys in root.iter('variant'):
    for variant in keys:
        if variant.text == 'PROGRAMS':
            for value_tag in keys.iter('value'):
                ParamValue = value_tag.find('value').text
                    if ParamValue == 'PROG2':
                        print "GOT IT!"
                    else: continue # <- this jumps to the "<value>PROG1</value>" tag
                                   # but it should jump to the "SECOND VALUE KEY"

问题出在哪里?

【问题讨论】:

  • 期望的输出是什么?
  • 让我们说它必须在if ParamValue == 'PROG2':条件之后打印一些东西

标签: python xml parsing lxml


【解决方案1】:
import lxml.etree as ET
root = ET.parse('data').getroot()

for value in root.xpath(
    '''//variant
           [name  
             [text()="PROGRAMS"]]
         /value
           [value
             [text()="PROG2"]]'''):
    print('GOT IT')

产量

GOT IT

我认为use XPath 更容易挖掘到你想要的元素。 XPath 意味着

//                         # look for all elements
variant                    # that are variants
   [name                   # that have a <name> element
     [text()="PROGRAMS"]]  # with text equal to "PROGRAMS" 
 /value                    # select the <value> (child of variant)
   [value                  # that has a child <value> element
     [text()="PROG2"]]     # with text equal to "PROG2"

迭代&lt;value&gt; 元素的&lt;statistics&gt; 子元素:

for statistics in root.xpath(
    '''//variant
           [name  
             [text()="PROGRAMS"]]
         /value
           [value
             [text()="PROG2"]]
          /statistics'''):

在 XPath 中,方括号 [..] 松散地转换为“这样”。请注意,如果没有括号,上面的 XPath 将是 //variant/value/statistics。它看起来有点像文件路径。就像文件路径一样,它显示了元素的沿袭。一个/ 表示“直接子代”,而// 表示“后裔”(例如孩子、孙子或孙子等)。

【讨论】:

  • 如此简单的到达目的地的方法:o 但还有一个问题,如何开始迭代 PROG2 下的“统计”键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2016-07-12
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多