当前位置: 首页 > 知识库问答 >
问题:

在带有名称空间的xml文件中使用lxml库的Xpath问题

鄂坚
2023-03-14

我试图使用名称空间从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-namessped-节点命名空间"http://www.idpf.org/2007/opf"使用了两次,一次是在没有前缀的"包"中,一次是在有前缀的"元数据"中。所以在命名空间中添加另一个前缀是没有用的。

有人能帮我吗?

共有1个答案

鲍健柏
2023-03-14

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

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

这似乎奏效了

 类似资料:
  • 我正在尝试选择一个特定的

  • 问题内容: 我有以下格式的xml文档: 我需要使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。 我尝试过的各种方法是: 要么 要么 在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。 问题答案: 这样的事情应该起作用: 另请参见http://lxml.de/xpathxslt.html#namespaces-and- pr

  • 问题内容: 我有一个像这样开始的XML文件: 我将不得不打开许多这些文件。它们中的每一个都有不同的名称空间,但一次只能有一个名称空间(我永远不会在一个xml文件中找到两个定义的名称空间)。 使用XPath,我希望有一种自动的方法将给定的名称空间添加到名称空间管理器中。到目前为止,我只能通过解析xml文件来获取名称空间,但是我有一个XPathNavigator实例,并且它应该具有一种不错且干净的方式

  • 问题内容: 我正在尝试解析OpenOffice ODS电子表格中的内容。ods格式实质上只是一个带有许多文档的zip文件。电子表格的内容存储在“ content.xml”中。 电子表格的内容在一个单元格中: 我们也可以直接进入行: 各个元素都知道名称空间: 如何直接在find / findall中使用命名空间? 明显的解决方案不起作用。 尝试从表中获取行: 问题答案: 如果包含名称空间前缀,则可以

  • 问题内容: 您可以帮助我调整此代码,以便它成功解析XML吗?如果删除XML名称空间,它将起作用: 问题答案: 您必须在XPath中使用前缀,例如:“ / my:foo / my:bar”您可以选择任何喜欢的前缀-它与您在XML中使用或不使用的前缀无关。文件-但您必须选择一个。这是XPath 1.0的限制。 您必须执行从“我”到“ http://foo.bar/boo ”的前缀映射(而不是“ htt

  • 问题内容: 我正在尝试解析Java中的SOAP请求,但代码未返回任何节点,这里的代码可以使任何人找到错误 问题答案: 您需要设置一个上: 演示版 输出量