繁体   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