2012-04-01 4 views
6

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

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

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

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

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

ответ

9

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

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

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

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

+0

Я понятия не имею, почему я не думал об упаковке кода в свой собственный метод расширения XElement.Validate(). Кажется настолько логичным сейчас, что вы это говорите. Создание «XDocument» - еще одна хорошая идея, которая должна была произойти тоже меня (я потратил слишком много времени, пытаясь выяснить, как ее преобразовать, и я пропустил очевидное решение). Я буду экспериментировать с обоими и видеть, что я предпочитаю. – psubsee2003

Смежные вопросы