我想测试(正确或错误)任意 XML 文件是否与给定架构匹配。
就其价值而言,该架构是 Word 2003 WordML 架构,Microsoft 使用大约 7 个列表来定义该架构*.xsd
files.
这些文件之一还包括 W3Cxml.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.
.
因此,显然我要么需要显式添加它,要么不需要,具体取决于机器是否能够从互联网上静默下载它(或者甚至可能之前能够下载它,并将其缓存在某处)。
所以,“如果我做也该死,如果我不做也该死”。我是否需要尝试一种方式,捕获异常,然后尝试另一种方式?或者有更优雅的解决方案吗?