【问题标题】:xpath condition to descendants后代的xpath条件
【发布时间】:2015-09-24 18:59:03
【问题描述】:

我有下一个 xml 示例结构

<root>

<rec xmlns="some_url">
<itemNumber>
<number>1</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

</root>

问题是这里是xmlns,要找到一些元素,我需要通过本地名称找到它。例如查找所有&lt;rec&gt; 元素:

root.xpath("*[local-name() = 'rec']")

要查找所有itemNumber

root.xpath("*[local-name() = 'rec']/*[local-name() = 'itemNumber']")

主要障碍是命名空间。但是不要建议我删除名称空间,因为我的 xml 文档非常庞大,而且需要额外的时间。 我需要返回符合条件的&lt;rec&gt; 元素,例如&lt;number&gt; 等于2。在这种情况下,它将返回

<rec>
<itemNumber>
<number>1</number>
</itemNumber>
</rec>

【问题讨论】:

    标签: xml xpath lxml


    【解决方案1】:

    问题是这里是xmlns...

    使用命名空间并不是特别困难with lxml

    在 XPath 调用中,您只需传递一个 namespaces 参数,其前缀映射到此 some_url。然后你只需要在元素名称前使用那个前缀。

    示例 ipython 会话:

    In [1]: import lxml.etree
    
    In [2]: doc = lxml.etree.fromstring("""<root>
    
    <rec xmlns="some_url">
    <itemNumber>
    <number>1</number>
    </itemNumber>
    </rec>
    
    <rec>
    <itemNumber>
    <number>2</number>
    </itemNumber>
    </rec>
    
    <rec>
    <itemNumber>
    <number>2</number>
    </itemNumber>
    </rec>
    
    </root>""")
    
    In [3]: doc.xpath('ns:rec[ns:itemNumber=1]', namespaces={"ns": "some_url"})
    Out[3]: [<Element {some_url}rec at 0x7f358cccd2d8>]
    
    In [4]: 
    

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多