我正在尝试使用命名空间从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="{"is_category": true, "#extra#": 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
namspace“http://www.idpf.org/2007/opf”使用两次,一次在“package”中没有前缀,一次在“metadata”中,带有前缀。因此,在命名空间中添加另一个前缀无济于事。
有人可以帮我这个吗?
答案 0 :(得分:1)
如果您只是将opf前缀添加到xpath语句
//opf:meta[@name='calibre:user_metadata:#origfieldvalue']
这似乎可以解决问题