Сохранение сериализации пространства имен подэлемента с помощью lxml - PullRequest
2 голосов
/ 25 августа 2010

У меня есть несколько разных 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>

Любые идеи, как я могузаставить поведение, которое я хочу?

Спасибо

1 Ответ

0 голосов
/ 26 августа 2010

Можно попробовать сначала вставить элементы XInclude, а затем разрешить их методом .xinclude() (см. документы ).Кажется, это сохраняет объявления пространства имен (lxml сохраняет их, когда они исходят из анализатора, но не когда вы сами создаете элементы или перемещаете элементы из одного документа в другой)

Обратите внимание, что в вашем случае вы все равнонеобходимо изменить имя тега элементов: они будут включены в исходные документы в том виде, в каком они есть, без какого-либо пространства имен, в то время как вы, похоже, изменили их на имена элементов с пространством имен в выходных данных.

Возможно, у вас естьиспользовать пользовательский распознаватель , в отличие от того, что может показаться документам о .xinclude(), не поддерживающем это (он использует преобразователи из синтаксического анализатора, использованного для анализа содержащего документ, он просто не поддерживает передачуопределенный преобразователь или анализатор для обработки XInclude).

Другой вариант, вероятно, будет решением на основе xslt.

...