Используя .NET, чтобы подтвердить XML против схемы

StackOverflow https://stackoverflow.com/questions/3449180

  •  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 будет блокировать чрезмерные чтения к их сайту и случайным образом ваш код (или хуже, код вашего клиента) начнет провалиться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top