Ссылка на пространства имен в XSD - PullRequest
2 голосов
/ 22 февраля 2012

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

<?xml version="1.0" encoding="UTF-8"?>
<message>
  <Headerinfo>
    <Element1>stuff</Element1>
    <Element2>things</Element2>
  </Headerinfo>
  <CreateRequest xmlns="http://schemas.datacontract.org/2004/07/MyOrg.MyApp.DataContracts.MyObject" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Element3>more stuff</Element3>
    <Element4>more things</Element4>
    <Address xmlns:a="http://schemas.datacontract.org/2004/07/MyOrg.MyApp.DataContracts.Address">
      <a:AddressLine1>123 Main Street</a:AddressLine1>
    </Address>
  </CreateRequest>
</message>

1 - необходимо иметь возможность генерировать xmlns для сложного элемента CreateRequest.
2 - Необходимо иметь возможность генерировать xmlns: a for Address и его простые элементы.

Вот XSD, который у меня есть. Я считаю, что мне нужно добавить запись xs: scehma для записи a :. Не уверен, что еще, не могу заставить его работать.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="message">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Headerinfo">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Element1" type="xs:string"/>
              <xs:element name="Element2" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="CreateRequest">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Element3" type="xs:string"/>
              <xs:element name="Element4" type="xs:string"/>
              <xs:element name="Address">
                <xs:complexType>
                  <xs:sequence>
                    <a:element name="AddressLine1" type="xs:string"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Я не уверен, что вы подразумеваете под XSD "генерация вывода" - XSD обычно используется для проверки ввода.

Но спецификация схемы XML требует, чтобы вы писали один документ схемы на каждое пространство имен, причем каждый документ содержал объявления xs: import, чтобы определить зависимости между пространствами имен. Так оно и задумано, и нет смысла бороться с этим.

1 голос
/ 22 февраля 2012

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

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

...