Что я хочу сделать:
Я пытаюсь сгенерировать 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
сгенерировал его таким образом? Как это исправить?