簡體   English   中英

查找 lxml 的命名空間 URI

[英]Finding namespace URIs for lxml

我正在使用 lxml 使用以下代碼解析 XML 產品提要:

namespace = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
data = [loc.text for loc in tree.xpath("//sm:urlset/sm:url/sm:loc",namespaces=namespace)]

這適用於我用作輸入的大多數提要,但我偶爾會發現帶有其他命名空間的提要,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="https://www.sitemaps.org/schemas/sitemap/0.9
            https://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

<url>
  <loc>https://www.example.com/</loc>
  <priority>1.00</priority>
</url>

根據我的閱讀,我需要在此處添加額外的命名空間(我猜是 xmlns:xsi)到命名空間字典中,以使我的 xpath 能夠使用多個命名空間。 但是,這對我來說不是一個長期的解決方案,因為我將來可能會遇到其他不同的命名空間 - 有沒有辦法讓我搜索/檢測甚至刪除命名空間? 元素樹總是相同的,所以我的 xpath 不會改變。

謝謝

您不需要 map xsi前綴; 這僅適用於xsi:schemaLocation屬性。

您當前的映射和輸入文件之間的區別在於 XML 的默認命名空間中的“https”中有一個“s”。

要處理兩個命名空間 URI(或者實際上是urlset可能具有的任何其他命名空間 URI),首先要獲取根元素的命名空間 URI,然后在 dict 映射中使用它......

from lxml import etree

tree = etree.parse("input.xml")

root_ns_uri = tree.xpath("namespace-uri()")

namespace = {"sm": root_ns_uri}
data = [loc.text for loc in tree.xpath("//sm:urlset/sm:url/sm:loc", namespaces=namespace)]

print(data)

印刷...

['https://www.example.com/']

如果urlset並不總是根元素,您可能想要做這樣的事情......

root_ns_uri = tree.xpath("namespace-uri(//*[local-name()='urlset'])")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM