Проверка XML-схемы XElement - PullRequest
7 голосов
/ 01 апреля 2012

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

С этой целью яу меня есть 3 отдельных XSD файла, которые определяют схему для каждого из 3 XElements моих потребностей класса, однако я сталкиваюсь с некоторыми проблемами при проверке XElement относительно схемы.Похоже, не существует способа сделать это без обходного пути.

На странице MSDN способ расширения XElement.Validate(), похоже, предназначен для повторной проверки подэлементовбольшего файла.Аргумент XmlSchemaObject вызывает у меня проблемы, так как я не могу предположить, что он будет присутствовать в любом из XElements.Я думаю, что могу обойти эту проблему, взяв XmlSchemaElement из моего XmlSchemaSet для передачи в качестве аргумента XmlSchemaObject, но поскольку XmlSchemaSet уже все определяет, кажется странным, что это нужно делать.

Есть ли лучший вариант для проверки XElement со схемой без предварительной проверки всего XDocument?

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

1 Ответ

10 голосов
/ 02 апреля 2012

Я понимаю, что у вас есть проблема с предоставленным API, насколько я понимаю, у вас есть два варианта, один из которых состоит в том, чтобы поместить XElement в XDocument, например, с помощью. XDocument doc = new XDocument(xElementToValidate);, а затем вызвать метод Validate для этого XDocument, где все, что вам нужно передать, это XmlSchemaSet, второй вариант - это способ, которым вы обрисовали себя, а именно использование Validate метод XElement, убедившись, что вы передаете XmlSchemaSet и определение корневого элемента в этой схеме установлено как XmlSchemaObject. Если это простые схемы с одним определением элемента верхнего уровня, все, что вам нужно сделать, это, например,

    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.Add(null, "schema.xsd");
    schemaSet.Compile();

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First();

Если вы включите один из двух подходов в метод, то это не должно быть больше усилий, чем вызов аналогичного вспомогательного метода, который мог бы предоставить .NET Framework.

...