当前位置: 首页 > 面试题库 >

解析包含默认名称空间的xml以使用lxml获取元素值

邓崇凛
2023-03-14
问题内容

我有这样的xml字符串

str1 = """<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
    <loc>
        http://www.example.org/sitemap_1.xml.gz
    </loc>
    <lastmod>2015-07-01</lastmod>
</sitemap>
</sitemapindex> """

我想提取<loc>节点中存在的所有网址,即http://www.example.org/sitemap_1.xml.gz

我尝试了这段代码,但没有发声

from lxml import etree
root = etree.fromstring(str1)
urls = root.xpath("//loc/text()")
print urls
[]

我试图检查我的根节点格式是否正确。我尝试了这个并获得了与str1相同的字符串

etree.tostring(root)

'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n<sitemap>\n<loc>http://www.example.org/sitemap_1.xml.gz</loc>\n<lastmod>2015-07-01</lastmod>\n</sitemap>\n</sitemapindex>'

问题答案:

在处理具有默认名称空间的XML时,这是一个常见错误。您的XML具有默认的命名空间,在此声明为不带前缀的命名空间:

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

请注意,除非另外声明(使用显式名称空间前缀或指向不同名称空间uri的本地默认名称空间),否则不仅声明了默认名称空间的元素在该名称空间中,而且所有后代元素都隐式继承祖先默认名称空间。这意味着,在这种情况下,包括在内的所有元素loc都位于默认名称空间中。

要选择名称空间中的元素,您需要定义名称空间映射的前缀,并在XPath中正确使用该前缀:

from lxml import etree
str1 = '''<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
    <loc>
        http://www.example.org/sitemap_1.xml.gz
    </loc>
    <lastmod>2015-07-01</lastmod>
</sitemap>
</sitemapindex>'''
root = etree.fromstring(str1)

ns = {"d" : "http://www.sitemaps.org/schemas/sitemap/0.9"}
url = root.xpath("//d:loc", namespaces=ns)[0]
print etree.tostring(url)

输出:

<loc xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        http://www.example.org/sitemap_1.xml.gz
    </loc>


 类似资料:
  • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

  • 问题内容: 我知道这个问题已经被问了很多遍了,但是我没有得到任何适合我情况的建议,因此我在网上和这里进行搜索,尝试了所有方法,但没有任何效果。我只需要用命名空间cap解析此XML:并且只需要其中的四个条目。 我正在使用simpleXML,并且设置了一个小的简单测试脚本,它非常适合解析常规元素。我无法为自己的狄更斯找到或获得一种使用命名空间解析元素的方法。 这是一个小示例测试脚本,其中包含我正在使用

  • 是否有一种使用JAXB从非根元素以编程方式获取名称空间的方法? 我可以在根元素上使用以下内容(其中DetailedReport是根元素对象): 但是,如果我尝试使用来自同一个包的类型,但不是根元素,qname为null。 根据JAXBIntrospector的javadocs: 参数对象是以下情况的JAXB元素: 它是javax.xml.bind.JAXBElement的实例,object的类用@

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

  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空

  • 问题内容: 我正在使用JAXWS为正在构建的Java应用程序生成WebService客户端。 当JAXWS构建其XML以用于SOAP协议时,它将生成以下名称空间前缀: 我的问题是,除非 我的 XML代理人(XML namepspace前缀为),否则我的Counterpart(一家大型汇款公司)将管理我的客户端连接到的服务器,拒绝接受WebService调用( 请不要问我为什么 )。像这样: 所以我