【问题标题】:Xpath issue using lxml library in an xml file with namespaces在具有命名空间的 xml 文件中使用 lxml 库的 Xpath 问题
【发布时间】:2012-07-20 00:58:16
【问题描述】:

我正在尝试使用命名空间从 xml 文件中选择一个 xml 节点。我已经有一个选择工作,但不能让它为第二个工作。

这是简化的xml(在python代码中存储为BookMetaData):

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="calibre_id">
  <metadata xmlns:opf="http://www.idpf.org/2007/opf" 
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata">
    <dc:title>De blanke masai V2</dc:title>
    <meta name="calibre:user_metadata:#origfieldvalue" content="{&quot;is_category&quot;: true, &quot;#extra#&quot;: null}"/>
  </metadata>
</package>

这是我目前写的python代码:

#!/usr/bin/python
# All imports
import lxml.html
import lxml.etree

# namespaces
theNamespaces = {'opf' : "http://www.idpf.org/2007/opf", 
'dc' : "http://purl.org/dc/elements/1.1/", 
'calibre' : "http://calibre.kovidgoyal.net/2009/metadata",
'unique-identifier' : "calibre_id" }

# This part is working perfectly
theXMLdoc = lxml.etree.fromstring(BookMetaData)
theElement2 = theXMLdoc.xpath("//dc:title", namespaces = theNamespaces)[0]
print "lxml.html Source Value:"
print( theElement2.text)
print ""


# This part only returns an emtpy list
theOrigValueElement = theXMLdoc.xpath("//meta[@name='calibre:user_metadata:#origfieldvalue']", namespaces = theNamespaces)
print "Original value of OrigFieldValue:"
print( theOrigValueElement)
print ""

我尝试过但不起作用的方法:
how-to-use-xpath-from-lxml-on-null-namespaced-nodes 命名空间“http://www.idpf.org/2007/opf”被使用了两次,一次在“包”中不带前缀,一次在“元数据”中带前缀。因此,向命名空间添加另一个前缀将无济于事。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python xml xpath lxml xml-namespaces


    【解决方案1】:

    如果你只是在你的 xpath 语句中添加 opf 前缀

    //opf:meta[@name='calibre:user_metadata:#origfieldvalue']
    

    这似乎可以解决问题

    【讨论】:

    • 谢谢,成功了!虽然我不明白为什么有必要将前缀添加到 Xpath 如果它不在我尝试匹配的 xml 节点中。你能解释一下吗,或者给一个链接,我可以开始搜索解释吗?
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多