Путаница при проверке XML - PullRequest
2 голосов
/ 04 марта 2010

Признаюсь, я новичок в XML. У меня возникли проблемы при проверке некоторых XML против схемы. Вот соответствующая часть моей схемы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.me.com/orpm/kpi/automation/report"
    targetNamespace="http://www.me.com/orpm/kpi/automation/report">
    <xs:attribute name="Pattern">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Exact"/>
                <xs:enumeration value="Replace"/>
                <xs:enumeration value="Regex"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:complexType name="NameValue">
        <xs:all>
            <xs:element name="Value" type="xs:string"/>
        </xs:all>
        <xs:attribute ref="Pattern"/>
    </xs:complexType>
    <xs:element name="KpiReport">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Name" type="NameValue"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Вот неудачный xml:

<?xml version="1.0"?>
<KpiReport xmlns="http://www.me.com/orpm/kpi/automation/report"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.me.com/orpm/kpi/automation/report filename.xsd">
    <Name Pattern="Exact">
        <Value>Test</Value>
    </Name>
</KpiReport>

Не удается с этой ошибкой:

Description: cvc-complex-type.2.4.a: Invalid content was found starting with element 'Name'. One of '{Name}' is expected.

Я потерян на этом. Пожалуйста, помогите.

Ответы [ 3 ]

2 голосов
/ 04 марта 2010

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

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
</xs:schema>

это, по сути, делает то же самое, что и исправление, предложенное Дэвидом, но делает это, изменяя стандартное значение XSD, которое является более надежным.

объяснение того, что именно происходит, может быть слишком длинным, чтобы включать его сюда, и, вероятно, не представляет особого интереса.

2 голосов
/ 04 марта 2010

хорошо, поскольку Дэвид попросил об этом, вот полное объяснение: объявления элементов в XSD могут быть глобальными или локальными. глобальные объявления находятся на уровне непосредственно под xs: schema, локальные объявления - это объявления внутри других объявлений. глобально объявленные элементы по определению всегда определяются в targetNamespace схемы (если она есть). локальные объявления, с другой стороны, по умолчанию не находятся в пространстве имен (в частности, не в targetNamespace схемы), если вы не сделаете их «квалифицированными» одним из двух уже обсужденных методов. эффект элементов, объявленных без пространства имен, заключается в том, что документ должен выглядеть следующим образом (используя элементы «Имя» и «Значение» в качестве элементов без имен, уточненных в пространстве имен):

<?xml version="1.0"?> 
<KpiReport xmlns="http://www.me.com/orpm/kpi/automation/report"> 
    <Name xmlns=""> 
        <Value>Test</Value> 
    </Name> 
</KpiReport>

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

1 голос
/ 04 марта 2010

Происходит пара вещей и несколько возможных решений вашей проблемы.

Решение, которое вы можете использовать, будет зависеть от того, сможете ли вы изменить XML, XSD или оба.

Ниже приведен код XML, который проходит проверку вашей схемы:

<?xml version="1.0"?> 
<ns0:KpiReport xmlns:ns0="http://www.me.com/orpm/kpi/automation/report" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.me.com/orpm/kpi/automation/report filename.xsd"> 
    <Name ns0:Pattern="Exact"> 
        <Value>Test</Value> 
    </Name> 
</ns0:KpiReport>

Ключевым отличием является то, что в вашем xsd вы не определили элемент Name в пространстве имен http://www.me.com/orpm/kpi/automation/report. Я не совсем уверен, что происходит, но думаю, что наличие атрибута Pattern на уровне схемы запутало вещи. Используя префикс пространства имен ns0: сообщаем валидатору, что KpiReport и Pattern находятся в этом пространстве имен, а Name - нет.

Это решение может не подходить, поэтому другой вариант - настроить вашу схему, чтобы принять ваш пример XML. Ниже приведена схема, которая работает:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://www.me.com/orpm/kpi/automation/report" targetNamespace="http://www.me.com/orpm/kpi/automation/report" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="NameValue">
    <xs:all>
      <xs:element form="qualified" name="Value" type="xs:string" />
    </xs:all>
    <xs:attribute name="Pattern">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="Exact" />
          <xs:enumeration value="Replace" />
          <xs:enumeration value="Regex" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <xs:element name="KpiReport">
    <xs:complexType>
      <xs:sequence>
        <xs:element form="qualified" name="Name" type="NameValue" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Следует отметить, что атрибут Pattern теперь перемещен в NameValue complexType, и что имя и значение теперь указываются как form = "qualised". Квалифицированный означает, что эти элементы требуют префиксов пространства имен (в этом случае префикс по умолчанию или нет).

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

Надеюсь, это поможет вам, или что кто-то с более острыми рубцами XSD сможет заполнить пробелы.

...