Схема XML: AttributeGroup без вспомогательного элемента?Дублирующиеся атрибуты? - PullRequest
0 голосов
/ 26 мая 2011

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

Вот упрощенная версия схемы, которую мне дали:

<?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xsd:attributeGroup name="Group1">
            <xsd:attribute name="attrib1" type="xsd:NMTOKENS"/>
            <xsd:attribute name="attrib2" type="xsd:NMTOKENS"/>
        </xsd:attributeGroup>
</xsd:schema>

Прежде чем я вернусь к своим клиентам и раскритикую их схему, я очень ценю коллективный интеллект stackoverflowчтобы подтвердить или опровергнуть для меня следующее:

  1. Группа атрибутов должна использоваться каким-либо элементом в схеме.Не имеет смысла просто иметь attributeGroup отдельно в схеме.(если только эта схема не предназначена для импорта в другую)
  2. Атрибут в группе attributeGroup может встречаться только один раз в пределах одного элемента действительного документа XML.например:

    <?xml version="1.0"?>
    <element1 attrib1="first second third" attrib1="first second third"/>
    

    недопустим, потому что есть дубликат 'attrib1', правильно?

    • Мне сказали, что я могу получать документы с дублирующимися атрибутами.Я хотел бы сказать своим клиентам, что схема должна отражать эту возможность (если это вообще возможно ...).Есть ли способ определить атрибут, который может встречаться более одного раза?Мне известен атрибут maxOccurs, но я не верю, что он действителен для определения атрибута.

Заранее спасибо за ваш вклад.

1 Ответ

1 голос
/ 26 мая 2011

attributeGroup должна использоваться какой-то элемент в схеме. Нет смысла просто иметь attributeGroup стоит один в схема.

Ну, это зависит от того, имеет ли это смысл или нет. В XML атрибуты похожи на «дополнительную информацию, прикрепленную к элементу». Таким образом, в документе экземпляра атрибут не может существовать без элемента, который его «размещает». Чтобы иметь атрибут в экземпляре документа, необходимо, чтобы 1) был элемент, имеющий этот атрибут 2) этот атрибут как-то определен или указан в схеме. Если ни один элемент в схеме не определен (разрешен) для использования определенного атрибута, то этот атрибут не может появиться в документе экземпляра.

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

Атрибут в attributeGroup может произойти только один раз в течение действительного XML-документ. например:

<?xml version="1.0"?> <element1 attrib1="first second third" attrib1="first second third"/>

недопустимо, потому что есть дубликат 'attrib1', верно?

Ваш пример кода понятен: это не разрешено в XML. Как указано в рекомендации XML : «Имя атрибута НЕ ДОЛЖНО появляться в одном и том же начальном теге или теге пустого элемента». Опять же, утверждение, которое вы написали выше своего примера кода, не совсем верно. Возможно, что один и тот же атрибут может появляться несколько раз в допустимом XML-документе. Это просто должно появиться на разных элементах. Дублирование атрибутов на одном элементе не допускается. Однако вы можете дублировать элементы, чтобы все они имели одинаковые атрибуты.

Не допускается:

<element1 attrib1="first second third" attrib1="first second third"/>

Разрешено:

<element1 attrib1="first second third"/>
<element1 attrib1="first second third"/>

Как угловой случай, повторяющиеся имена атрибутов применяются к расширенным именам атрибутов.

<element ns1:attrib="value" ns2:attrib="value"/>

не допускается, если оба префикса ns1 и ns2 разрешаются в одном и том же URI пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...