我想测试(true或false)是否任意的
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方法显式添加:当机器未连接到互联网时,验证现在可以正常工作.
但是当机器连接到互联网时,我现在得到一个错误,称全局属性“http://www.w3.org/XML/1998/namespace:lang”已经被声明..
显然,我需要明确添加它,或者我不这样做,这取决于机器是否能够从互联网上静默下载(或者甚至可能已经能够下载它,并且在某个地方缓存).
我们看不到您的代码,但在许多实现中,这是通过使用目录解析器将.xsd的请求重定向到本地副本来处理的.有一个属性
XmlReaderSettings.XmlResolver可以用于此.有关可以使用的Apache授权实现,请参阅
XMLCatalog.net.
原文链接:https://www.f2er.com/xml/292316.html这样做的一个副作用是您可以在本地保存所有模式.这尤其重要,因为W3C将阻止对其网站的读取过多,随机的代码(或更糟的是您的客户代码)将开始失败.