簡體   English   中英

使用lxml保留子元素名稱空間序列化

[英]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.

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