XML - двойные URI в одном определении xmlns, действительно ли это?

У меня есть некоторый XML с объявлением xmlns следующим образом:

<dc:record xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mods="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd">

Эта строка, кажется, отключает синтаксический анализатор eTree XML в Python:

lxml.etree.XMLSyntaxError: xmlns:mods: 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd' is not a valid URI, line 6, column 63

Если я удалю один из двух URI, найденных в объявлении xmlns:mods, он будет нормально проанализирован.

Итак, зная, что элемент xmlns предназначен для облегчения синтаксического анализа человеком и не предназначен для особого уважения, является ли это подлинным ограничением на XML (иметь один URI в объявлении пространства имен xmlns) или это чрезмерно усердное соблюдение со стороны парсер lxml etree?


person Jay Gattuso    schedule 08.04.2013    source источник
comment
Придирка: xmlns не предназначено для людей — это фактическое пространство имен, а пространство имен должно быть URI (уважительным или нет). Это префикс для людей.   -  person Francis Avila    schedule 08.04.2013
comment
@FrancisAvila Ааа, очень хорошо, спасибо. Считай мою гниду, выбрал.   -  person Jay Gattuso    schedule 08.04.2013


Ответы (2)


Я думаю, что lxml.etree делает правильную вещь здесь.

Согласно спецификации, атрибут объявления пространства имен должен иметь значение, которое является «либо ссылкой IRI — именем пространства имен, идентифицирующим пространство имен, — либо пустой строкой»

В вашем примере значение атрибута "http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" не является допустимым IRI (например, двоеточие в неправильном месте).

person bbayles    schedule 08.04.2013
comment
Я склонен согласиться. Я ценю ваши мысли. Всегда полезно получить сторонний/экспертный взгляд на эти вещи. Спасибо. - person Jay Gattuso; 08.04.2013

Вопрос о том, ДОЛЖНО ли имя пространства имен быть действительным URI, является спорным. Конечно, то, что у вас здесь, неправильно; а вот не "переусердствует" ли ваш парсер - это другой вопрос.

В спецификации пространств имен 1.1 в разделе 8 говорится: «Процессор должен сообщать о нарушениях правильности пространства имен, за исключением того, что не требуется проверять, являются ли имена пространств имен допустимыми IRI».

На практике большинство синтаксических анализаторов не выполняют эту проверку, и как только большинство программных продуктов проявляют снисходительность к принудительному выполнению положения в спецификации, программное обеспечение, обеспечивающее его соблюдение, начинает становиться непопулярным среди пользователей.

person Michael Kay    schedule 08.04.2013
comment
Отличный ответ, спасибо. Думаю, в этом отношении оба варианта правы. Анализатор выполняет свою работу, и объявление (формированность IRI) соответствует общему соглашению. - person Jay Gattuso; 08.04.2013