Создание файла XSD с помощью инструмента xsd.exe из файла XML с несколькими пространствами имен - PullRequest
4 голосов
/ 21 ноября 2011

Что я хочу сделать:

Я пытаюсь сгенерировать XSD-файл для существующего XML-файла.

Я использую инструмент xsd.exe (поставляется с Visual Studio).

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

<images>
  <icons>
    <icon url="http://www.icons.com/logo.png"/>     
  </icons>
  <foo:icons>
    <foo:foo_icon url="http://www.foo.org/pic.ico"/>
  </foo:icons>
</images>

Что я получаю:

При вызове xsd.exe myfile.xml выдает ошибку: Cannot add a column named 'icons': a nested table with the same name already belongs to this DataTable.

Хорошо, но для этого и существует пространство имен, не так ли? Решить двусмысленность, как это. Если бы не было пространств имен, я бы просто назвал элемент foo_icons вместо того, чтобы играть с префиксами.

Что я пробовал:

Я пытался найти способ настроить xsd.exe так, чтобы он учитывал пространства имен, но ни xsd /?, ни мои запросы Google не дали ответа. Параметр /n[amespace]: не позволяет указывать несколько пространств имен.

Я прочитал Работа с пространствами имен в XML-схеме , но я не чувствую себя намного мудрее.

Нужно ли создавать отдельные файлы XSD и вставлять их друг в друга? Это также не касается использования xsd.exe для этой цели.

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

Редактировать 1 - по предложению Марка Гравелла:

Я пытался это сделать, но мне также пришлось переименовать (префиксный) элемент, который появился в разных разделах XML (в разных родительских узлах), так как xsd этого не допустит. Мне пришлось переименовать его в elementOne, elementTwo и т. Д. Я собирался переименовать его обратно вручную. Но XSD, который я получил, все равно не работает.

Заголовок:

<xs:schema id="NewDataSet" targetNamespace="http://www.foo.com/bar" xmlns:mstns="http://www.foo.com/bar" xmlns="http://www.foo.com/bar" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" 
xmlns:app1="http://www.foo.com/bar/extensions"
xmlns:app2="http://www.w3.org/XML/1998/namespace">

И когда я пытаюсь проверить файл с ним, я получаю сообщение об ошибке:

Prefix 'app2' cannot be mapped to namespace name reserved for "xml" or "xmlns".

Итак, с какой целью xsd.exe сгенерировал его таким образом? Как это исправить?

1 Ответ

3 голосов
/ 22 ноября 2011

То, как вы используете xsd.exe, чтобы дать вам XML-схему ... он на самом деле пытается создать DataSet;и это на .NET действительно очень ограничено.

Я бы использовал другой вариант, доступный в .NET: для создания сценария с использованием документированного .NET API здесь .

По крайней мере для вашего фрагмента XML, это 'буду работать;Я попробовал это, и он создает действительный XmlSchemaSet.Ниже приведен тест, который я запустил с помощью инструмента, который я использую, который опирается на тот же API (с некоторыми дополнительными функциями, которые в противном случае вам придется делать небольшие исправления вручную).

ИсправленоXML (добавлено отсутствующее объявление пространства имен для префикса foo):

<images>
    <icons>
        <icon url="http://www.icons.com/logo.png"/>
    </icons>
    <foo:icons xmlns:foo="urn:tempuri-org:test">
        <foo:foo_icon url="http://www.foo.org/pic.ico"/>
    </foo:icons>
</images>

Схема верхнего уровня (без целевого пространства имен, соответствует элементу изображений):

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema xmlns:foo="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:import schemaLocation="XSDMultipleNamespaces1.xsd" namespace="urn:tempuri-org:test" />
  <xsd:element name="images">
    <xsd:complexType>
  <xsd:sequence>
    <xsd:element name="icons">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="icon">
            <xsd:complexType>
              <xsd:attribute name="url" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element ref="foo:icons" />
  </xsd:sequence>
</xsd:complexType>

Схема для пространства имен foo:

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema xmlns="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:tempuri-org:test"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="icons">
<xsd:complexType>
  <xsd:sequence>
    <xsd:element name="foo_icon">
      <xsd:complexType>
        <xsd:attribute name="url" type="xsd:string" use="required" />
      </xsd:complexType>
    </xsd:element>
  </xsd:sequence>
</xsd:complexType>

Сгенерированные файлы схемы XML хороши для проверки вашего XML.

...