Я хочу проверить (правда или ложь), соответствует ли произвольный файл XML заданной схеме.
Что бы это ни стоило, схема — это схема Word 2003 WordML, которую 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.
.
Так что, по-видимому, мне либо нужно добавить его явно, либо нет, в зависимости от того, может ли машина автоматически загрузить его из Интернета (или даже, возможно, ранее могла загрузить его и где-то кэшировала).
Итак, «будь я проклят, если я сделаю это, и будь я проклят, если я этого не сделаю». Нужно ли мне попробовать это одним способом, поймать исключение, а затем попробовать другим способом? Или есть более элегантное решение?