Загрузка встроенного XSD с импортом в DataSet - PullRequest
2 голосов
/ 15 марта 2012

Моя цель - загрузить встроенный xsd с импортом в DataSet, а затем сгенерировать таблицы на основе xsd.

Я пытаюсь загрузить DataSet с помощью XML-схемы, состоящей из нескольких импортируемых XSD-файлов. Делать это с файлами, расположенными в файловой системе, не проблема, я просто передаю ему основной файл xsd, и все загружается нормально, и все операции импорта xsd решаются. То, что я хотел бы сделать, это встроить мой xsd в мою DLL, чтобы он не сидел в файловой системе. Проект, имеющий встроенные файлы xsd, отделен от проекта, который будет обращаться к файлам xsd для загрузки в DataSet.

Метод DataSet.ReadXmlSchema может принимать поток, XmlReader, string uri или XmlTextReader. У меня нет проблем с загрузкой dll и последующим переходом к основному файлу схемы с помощью assembly.GetManifestResourceStream (schemaPath), что было бы хорошо, если бы моя схема была всего одним файлом. Проблема в том, что как только я передаю это методу DataSet.ReadXmlSchema, он не может найти какой-либо импорт.

Я пытался использовать XmlReader и использовать объект XmlReaderSettings с пользовательским распознавателем XML, который я написал для предыдущей проблемы (и я знаю, что это работает). В прошлом я использовал специальный распознаватель xml для загрузки аналогичной схемы, встроенной в dll, в XmlSchemaSet, и она работала как чудо. Поэтому, когда я выполняю вызов XmlReader.Create, я передаю XmlReaderSettings, который использует мой настраиваемый Xml Resolver, но когда я передаю этот XmlReader методу DataSet.ReadXmlSchema, он также не может найти импортированные файлы схемы. Я установил точку останова в перегруженном методе GetEntity, и он никогда не срабатывает. Таким образом, XmlReader, похоже, не использует предоставленный мной XmlResolver. У меня была такая же проблема с XmlTextReader.

Любые идеи о том, как я мог бы загрузить загрузку встроенной схемы с импортом в DataSet? Мое последнее средство - временно скопировать внедренные xsd-файлы в файловую систему, чтобы создать DataSet, а затем удалить их, хотя я пытаюсь избежать этого.

1 Ответ

2 голосов
/ 16 марта 2012

К сожалению, нет, невозможно загрузить DataSet из нескольких XSD, встроенных в качестве ресурсов.

Обоснование в этом методе класса DataSet:

internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

При написании кода используется XmlSchemaSet ; он использует переданное вами средство чтения (XmlReader) для загрузки схемы, добавления ее в XmlSchemaSet и компиляции.

К сожалению, чтобы скомпилировать XmlSchemaSet при использовании встроенных ресурсов, один должен предоставить преобразователь xml для объекта XmlSchemaSet! ... дело в том, что в тот момент не было ни одного, который можно было бы использовать в процессе. Хотя настройки считывателя могут быть настроены с помощью распознавателя, как вы знаете, это только запись (нет получателя).

Чтобы проверить сказанное, попробуйте загрузить XmlSchemaSet из тех же встроенных ресурсов; вы заметите, что независимо от того, что вы пытаетесь, средство разрешения должно быть установлено на уровне XmlSchemaset, а не на уровне XmlReader.

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

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