XSD.exe и «Ссылки круговой группы» - PullRequest
17 голосов
/ 05 марта 2010

Я пытаюсь создать некоторые классы, чтобы можно было десериализовать файл XML, созданный сторонним приложением.К счастью, разработчик стороннего приложения включил файл схемы в свой код, чтобы можно было понять XML-файл.

Когда я использую инструмент XSD.exe из Visual Studio, процесс завершается с ошибкой, сообщая о следующей ошибке

"Группа 'SegGroupOrSegmentGrouping' из targetNamespace = '' имеет недопустимое определение: ссылка на круговую группу."

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

Ответы [ 4 ]

12 голосов
/ 10 ноября 2010

У меня недавно была такая же проблема,

Мне дали Схему от сторонней компании, которая возвращала структуру XML из веб-службы. Затем я хотел десериализовать ответ и сохранить информацию в базе данных с помощью NHibernate.

Нет проблем. Я думал, что просто воспользуюсь xsd.exe и у меня будут занятия. К сожалению, этого не должно было быть. Ошибка Xsd.exe с точно такой же ошибкой, которую вы получаете. Это потому, что он не может разрешить циклические ссылки.

Я провел несколько дней, глядя на альтернативы, пока в конце не написал свою собственную структуру классов для схемы и не смог идеально десериализоваться. Ответ здесь - написать свои собственные классы C # и украсить их соответствующими атрибутами.

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

Мне потребовалось около 3 дней, чтобы написать структуру класса (она была большой), но я получил качественное решение.

В одном можно быть уверенным, что вы не сможете использовать xsd.exe и большинство других инструментов, которые я пробовал после поиска в Google, либо он не работал должным образом, либо имел ошибки.

10 голосов
/ 08 июля 2015

Попробуйте использовать svcutil; он может обрабатывать циклические ссылки.

В следующем примере eExact-Schema.xsd - это XSD, который xsd.exe не может обработать.

Пример:

C:\SRC\Exact>svcutil eExact-Schema.xsd /language:C# /dataContractOnly /importxmltypes /out:exact.cs

Это всегда хорошее место для начала; теперь вы можете использовать этот класс и изменять его в соответствии со своим стилем / потребностями, добавлять комментарии и т. д., и это сэкономит вам много времени / поисков, выполняя все с нуля.

3 голосов
/ 14 августа 2012

Попробовав несколько сторонних инструментов, я обнаружил, что у Liquid Technologies есть очень надежный генератор под названием Liquid XML Data Binder 2012 . Он смог справиться с проблемой круговой групповой ссылки, с которой я столкнулся. Он может генерировать код практически для любой версии .net от 2.0. Классы, которые он генерирует, зависят от распространяемого dll, который они предоставляют. Я использую пробную версию, и я не удивлюсь, если покупка полной версии будет необходима, прежде чем я выйду в релиз. Тем не менее, сэкономив мне, вероятно, сто часов и более ошибок, подверженных ошибкам, я не могу пожаловаться.

0 голосов
/ 30 апреля 2013

Самым простым способом для меня является создание файла XSD из фактического файла XML с помощью XSD.EXE. Затем создайте класс из нового файла XSD. Вам может потребоваться периодически изменять класс, если вводятся узлы или типы, которых не было в исходном XML, но вы сэкономите ЧАСЫ времени кодирования !!!!

...