Используйте две схемы в одном XML - PullRequest
2 голосов
/ 16 декабря 2009

У меня есть следующие xsd файлы:

SchemaA

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber" type="xs:int">
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

SchemaB

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaB"
           elementFormDefault="qualified"
           xmlns="http://schemaB" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:attribute name="Name" type="xs:string" />
</xs:schema>

Я пытаюсь ссылаться на них и использовать их из следующего XML:

<?xml version="1.0"?>
<Configuration xmlns="http://schemaA"
               xmlns:ba="http://schemaB">
    <StationNumber ba:Name="aaa">1</StationNumber>
</Configuration>

Visual Studio 2008 подчеркивает ba: имя как ошибка с описанием: атрибут 'http://schemaB:Name' не объявлен.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2009

Это не проблема двух схем, ваши схемы не соответствуют содержанию вашего документа. Атрибут Имя не указан в качестве одного из возможных атрибутов в Конфигурация .

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

Или вы разрешаете любому атрибуту из второго пространства имен появляться в первой схеме, например ::

<xs:element name="Configuration">
  <xs:complexType>
    <xs:all>
        <xs:element name="StationNumber" type="xs:int"/>
    </xs:all>
    <xs:anyAttribute namespace="http://schemaB"/>
  </xs:complexType>
</xs:element>

ИЗМЕНЕНО: после комментария от ewernli ниже, который правильно указывает, что это имеет дополнительную проблему, что StationNumber имеет простой тип. Если вы хотите подготовить тип для принятия атрибутов, вам нужно сделать его сложным:

<xs:element name="Configuration">
  <xs:complexType>
    <xs:all>
      <xs:element name="StationNumber">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:int"/>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:anyAttribute namespace="http://schemaB"/>
  </xs:complexType>
</xs:element>

Теперь вы можете прикрепить атрибут, как описано выше.

1 голос
/ 16 декабря 2009

Если элемент StationNumber не содержит атрибута в schemaA, то <StationNumber ba:Name="...">...</StationNumber> недопустим.

Решение 1 : встроить schemaB в schemaA и правильно определить атрибут

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:int">
                                <xs:attribute name="Name" type="xs:string"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

Затем NetBeans будет проверять следующий XML:

   <ns2:Configuration  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
       xmlns:ns2='http://schemaA'
       xsi:schemaLocation='http://schemaA file:/.../src/schemaA.xsd
       http://xml.netbeans.org/schema/schemaB file:/.../schemaB.xsd'>
              <ns2:StationNumber Name="aaa">1</ns2:StationNumber>
    </ns2:Configuration>

Решение 2: У вас все еще может быть отдельный schemaB для определения атрибута, но вам нужно будет импортировать его в schemaA с помощью ref:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemaA"
           elementFormDefault="qualified"
           xmlns="http://schemaA"
           xmlns:ba='http://schemaB'
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

                <xs:import namespace="http://schemaB"
                 schemaLocation="schemaB.xsd"/>

 <xs:element name="Configuration">
  <xs:complexType>
            <xs:all>
                <xs:element name="StationNumber">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:int">
                                 <xs:attribute ref="ba:Name"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:all>
  </xs:complexType>
 </xs:element>
</xs:schema>

Тогда XML выглядит так:

<ns1:Configuration  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:ns1='http://schemaA'
   xmlns:ba='http://schemaB'
   xsi:schemaLocation='http://schemaA file:/.../schemaA.xsd'>
    <ns1:StationNumber ba:Name="aaa"  >1</ns1:StationNumber>
</ns1:Configuration>
0 голосов
/ 16 декабря 2009

Он должен быть в состоянии найти XSD из пространства имен, и это то, на что он жалуется. Вы можете использовать schemaLocation в вашем экземпляре документа, чтобы объявить это.

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