Используя .NET, чтобы подтвердить XML против схемы
-
27-09-2019 - |
Вопрос
Я хочу проверить (true или false), будь то арбитра XML-файл соответствует данной схеме.
Для чего это стоит, схема - это Схема WordML WordML Word 2003, которую Microsoft определяет использование списка около 7 *.xsd
файлы.
Один из этих файлов также включает в себя W3C xml.xsd
Файл, включая следующее утверждение:
<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>
Я использую код .NET, как следующее, чтобы сделать проверку:
public static void validate(string filename)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(
"http://schemas.microsoft.com/office/word/2003/wordml",
//to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe"
@"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
XmlReader xmlReader = XmlReader.Create(filename, settings);
while (xmlReader.Read()) { }
}
Моя проблема в том, что если я запускаю этот код на машине, который не подключен к Интернету, то я получаю XmlSchemaValidationException
Ошибка к эффекту, которое он не может найти xml.xsd
.
Чтобы исправить это, я загрузил копию XML.XSD и добавить ее явно с помощью settings.Schemas.Add
Метод: Валидация сейчас работает правильно, когда машина не подключена к Интернету.
Однако, когда машина подключена к Интернету, я сейчас получаю сообщение об ошибке, что The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared.
.
Так что, по-видимому, мне либо нужно добавлять его явно, или я не в зависимости от того, умеет ли машина могла молча загрузить ее из Интернета (или даже, возможно, раньше была в состоянии скачать его, и она где-то кэшировала).
Итак, это «прокляты, если я сделаю и проклятую, если я не». Мне нужно попробовать это в одну сторону, поймать исключение, а затем попробовать это другим способом? Или есть ли более элегантное решение?
Решение
Мы не можем видеть ваш код, но Во многих реализациях это обрабатывается путем перенаправления запроса на .xsd к локальной копии с использованием Resolver каталога. Есть недвижимость Xmlreadersettings.xmlresolver Это можно использовать для этого. Видеть Xmlcatalog.net.net.net Для реализации, лицензированной Apache, вы можете использовать.
Побочный эффект этого заключается в том, что вы можете держать все схемы кэшировать локально. Это особенно важно, так как W3C будет блокировать чрезмерные чтения к их сайту и случайным образом ваш код (или хуже, код вашего клиента) начнет провалиться.