Два разных XML пространства имен с одним и тем же URL - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь выполнить некоторую очистку данных с помощью библиотеки дерева элементов xml в python.

Мои xml входные файлы выглядят следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<mods:mods xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/mods/v3" version="3.5" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-5.xsd">
  <mods:titleInfo>
    <mods:title>1971, Human Events</mods:title>
  </mods:titleInfo>
  <mods:name type="personal" authority="naf" valueURI="https://lccn.loc.gov/n88172648">
    <mods:namePart>Kellems, Vivien, 1896-1975</mods:namePart>
    <mods:role>
      <mods:roleTerm authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/col" type="text">Collector</mods:roleTerm>
    </mods:role>
  </mods:name>
  <mods:typeOfResource>text</mods:typeOfResource>
  <mods:genre authority="aat" valueURI="300111999">publications (documents)</mods:genre>
  <mods:originInfo>
    <mods:dateIssued encoding="w3cdtf" keyDate="yes">1971</mods:dateIssued>
  </mods:originInfo>
  <mods:physicalDescription>
    <mods:digitalOrigin>reformatted digital</mods:digitalOrigin>
    <mods:internetMediaType>image/jp2</mods:internetMediaType>
  </mods:physicalDescription>
  <mods:note type="ownership">Archives &amp; Special Collections at the Thomas J. Dodd Research Center, University of Connecticut Library</mods:note>
  <mods:identifier type="local">1992-0033/SeriesIII:Activism/SubseriesA:PoliticalCampaigns/Box138:6</mods:identifier>
  <mods:identifier type="local">MSS 1992.0033</mods:identifier>
  <mods:identifier type="local">39153030468468</mods:identifier>
  <mods:accessCondition type="use and reproduction">In Copyright</mods:accessCondition>
  <mods:recordInfo>
    <mods:recordContentSource>University of Connecticut Library</mods:recordContentSource>
    <mods:recordCreationDate encoding="w3cdtf">2018-07-09-04:00</mods:recordCreationDate>
    <mods:languageOfCataloging>
      <mods:languageTerm authority="iso639-2b" type="code">eng</mods:languageTerm>
    </mods:languageOfCataloging>
  </mods:recordInfo>
  <mods:note type="source note">Vivien Kellems Papers</mods:note>
  <mods:note type="source identifier">MSS 1992.0033</mods:note>
  <identifier type="hdl">http://hdl.handle.net/11134/20002:860633493</identifier>
</mods:mods>

Все, что мне нужно сделать, это изменить тег идентификатора в конце, чтобы иметь тот же префикс, что и остальные теги, префикс "модов". И добавить указанный атрибут c hlink в тег accessCondition. Я успешно сделал обе эти вещи. Но после того, как я запишу эти изменения обратно в файл и попытаюсь использовать синтаксический анализатор xml, я получаю следующую ошибку:

xml.etree.ElementTree.ParseError: unbound prefix: line 25, column 2

Теперь я думаю, что это проблема пространства имен, потому что "xmlns" : пространство имен mods "и пространство имен" xmlns "имеют одинаковые URL, поэтому, когда я регистрирую пространство имен в анализаторе, примерно так:

ET.register_namespace('', "http://www.loc.gov/mods/v3")
ET.register_namespace('mods', "http://www.loc.gov/mods/v3")
ET.register_namespace('xlink', "http://www.w3.org/1999/xlink")
ET.register_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance")

Он также удаляет одно из пространств имен при обратной записи в xml file, объявления пространства имен выглядят так:

<mods:mods xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.5" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-5.xsd">

А именно, объявление "xmlns". Отображается только объявление "xmlns: mods". И снова я думаю, что это из-за того, что они имеют одинаковые URL. Есть ли в любом случае это исправить. Любая помощь будет оценена.

1 Ответ

1 голос
/ 01 апреля 2020

http://www.loc.gov/mods/v3 - пространство имен. mods - это не что иное, как сокращение (он же «префикс»). Вы можете иметь столько разных сокращений для одного и того же пространства имен в своем документе XML, сколько пожелаете.

Например:

<something xmlns="http://www.loc.gov/mods/v3">
  <mods:something_else xmlns:mods="http://www.loc.gov/mods/v3" />
  <blah:another_thing xmlns:blah="http://www.loc.gov/mods/v3" />
  <last_thing />
</something>

и

<mods:something xmlns:mods="http://www.loc.gov/mods/v3" xmlns:blah="http://www.loc.gov/mods/v3">
  <something_else xmlns="http://www.loc.gov/mods/v3" />
  <mods:another_thing />
  <blah:last_thing />
</mods:something>

и любое число других комбинаций представляет точно такой же документ .

Когда они анализируются, а затем снова сериализуются, все эти объявления пространства имен могут быть сохранены в точности такими, как они есть, или могут быть сложены в один префиксы можно переименовать в ns0 или превратить в пространство имен по умолчанию - это не имеет значения. Это полностью зависит от того, как реализована библиотека XML.

Пока каждый элемент в результирующем документе находится в пространстве имен http://www.loc.gov/mods/v3, он является одним и тем же документом для любой соответствующей метри c:

<something xmlns="http://www.loc.gov/mods/v3">
  <something_else />
  <another_thing  />
  <last_thing />
</something>

Другими словами, ничего не сломано, поэтому ничего не нужно исправлять.

...