[英]Preserving subelement namespace serialization with lxml
我有一些不同的XML文檔,我正在嘗試使用lxml合並為一個。 問題是我需要結果來保留每個子文檔的根節點上的名稱空間。 Lxml似乎想將多次使用的所有名稱空間聲明推送到新文檔的根目錄,這會在我的應用程序中中斷(這是一個公認的錯誤)。
例如,我有文檔A:
<dc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/">
<title>La difesa della razza: scienza, documentazione, polemica. anno 1:n. 1</title>
</dc>
和文件B:
<mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd">
<titleInfo>
<nonSort>La</nonSort>
<title>difesa della razza</title>
<subTitle>scienza, documentazione, polemica</subTitle>
<partNumber>anno 1:n. 1</partNumber>
</titleInfo>
</mods>
我想將它們包裝在也使用xsi:schemaLocation的元素中,但是我需要名稱空間聲明(xmlns:xsi =“ http://www.w3.org/2001/XMLSchema-instance”)出現在所有這三個元素中節點,如下所示:
<wrap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org" xmlns:dc="http://www.foo.org" xmlns:mods="http://www.bar.org">
<dc:dc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/">
<dc:title>La difesa della razza: scienza, documentazione, polemica. anno 1:n. 1</dc:title>
</dc:dc>
<mods:mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd">
<mods:titleInfo>
<mods:nonSort>La</mods:nonSort>
<mods:title>difesa della razza</mods:title>
<mods:subTitle>scienza, documentazione, polemica</mods:subTitle>
<mods:partNumber>anno 1:n. 1</mods:partNumber>
</mods:titleInfo>
</mods:mods>
</wrap>
但是,當我使用Python / lxml附加這兩個文檔時
wrap.append(dc)
wrap.append(mods)
我將聲明推送到使用它的最高級別的節點。 不幸的是,這對我的應用程序是一個問題。 像這樣:
<wrap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org" xmlns:dc="http://www.foo.org" xmlns:mods="http://www.bar.org">
<dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/">
<dc:title>La difesa della razza: scienza, documentazione, polemica. anno 1:n. 1</dc:title>
</dc:dc>
<mods:mods xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd">
<mods:titleInfo>
<mods:nonSort>La</mods:nonSort>
<mods:title>difesa della razza</mods:title>
<mods:subTitle>scienza, documentazione, polemica</mods:subTitle>
<mods:partNumber>anno 1:n. 1</mods:partNumber>
</mods:titleInfo>
</mods:mods>
</wrap>
有什么想法可以強迫我進行自己想要的行為嗎?
謝謝
您可以嘗試先插入XInclude
元素,然后使用.xinclude()
方法解析它們(請參閱docs )。 這似乎保留了名稱空間聲明(當lxml來自解析器時,它們會保留它們,但是當您自己創建元素或將元素從一個文檔移動到另一個文檔時,lxml會保留它們)
請注意,在您的情況下,您仍然需要更改元素的標記名:它們將按原樣包含在原始文檔中,沒有任何名稱空間,而您似乎已在輸出中將它們更改為命名空間的元素名稱。
您可能必須使用自定義解析器 ,這與文檔中關於.xinclude()
不支持該解析器的說法似乎相反(它確實使用了用於解析包含文檔的解析器中的解析器,它只是不支持傳遞特定的XInclude處理程序的解析器或解析器)。
另一個選擇可能是基於xslt的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.