使用.NET来验证对XML架构
-
27-09-2019 - |
题
欲测试(真或假)的任意的XML文件是否一个给定的模式相匹配。
有关它的价值,该架构是Word 2003中的WordML的架构,微软定义了使用的约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使用目录解析本地副本请求处理。有一个属性 XmlReaderSettings.XmlResolver 那可以用于此目的。请参见 XMLCatalog.net 一个Apache授权的实现就可以使用。
这方面的一个副作用是,你可以保持本地缓存的所有模式。这一点尤其重要,因为W3C将阻止过度读取到他们的网站,并随机代码(或更糟的是,你的客户的代码)将开始失败。