如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?
Posted
技术标签:
【中文标题】如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?【英文标题】:How to validate my own Schema XSD file againts XMLSchema.xsd using MSXML? 【发布时间】:2020-03-16 11:13:53 【问题描述】:-
我使用 Windows 和 MSXML 库 (msxml6.dll)。
我在当前主题中的示例也使用了 JS。
如何根据 XMLSchema.xsd 验证我自己的方案(XSD 文件)?
在下面的示例代码中有关于我遇到的问题的注释。
var xs, xd;
main();
function main()
try
xs = new ActiveXObject("MSXML2.XMLSchemaCache.6.0");
xd = new ActiveXObject("MSXML2.DOMDocument.6.0");
catch (e)
WScript.Echo("Mirosoft XML Core Services (MSXML) 6.0 is not installed.\n"
+"Download and install MSXML 6.0 from http://msdn.microsoft.com/xml\n"
+"before continuing.");
return;
try
xd.async = false;
xd.validateOnParse = false;
xd.setProperty('ResolveExternals', false);
xd.setProperty('ProhibitDTD', false);
xd.setProperty('UseInlineSchema', false);
xd.setProperty('MultipleErrorMessages', true);
xd.load("e:\\Temp\\__SuperTemp\\XMLSchema.xsd") // just loaded from here http://www.w3.org/2001/XMLSchema.xsd
catch (e)
WScript.Echo("Failed to load schema cache: "+e.description);
return;
if (xd.parseError.errorCode != 0)
WScript.Echo("Failed to parse schema cache: "+xd.parseError.reason);
return;
try
// Here the error occured:
// XMLSchema.xsd#/schema/element[1][@name = 'schema']/complexType[1]/complexContent[1]/extension[1]/attribute[8]
// The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared.
// I really dont know what to do around it :((
xs.add("http://www.w3.org/2001/XMLSchema", xd);
catch (e)
WScript.Echo("Failed to add schema cache: "+e.description);
return;
// Next I wanted to validate my own XSD against XMLSchema.xsd.
// But the error above occured. Soo, the further code is skipped...
【问题讨论】:
【参考方案1】:首先,用于模式文档的 W3C 模式 (S4SD) 做了一些用户模式中不允许的事情,例如定义新的原始类型,因此无法保证每个模式处理器都将其视为有效模式。我不知道 MSXML 是否存在问题(尽管它相当古老且令人尊敬......)
您遇到的具体问题似乎是 S4SD 导入了 XML 命名空间的架构
并且您似乎正在选择未声明 xml:lang 的该模式的一个版本。我不知道为什么会这样。可能值得进行某种监视,以查看 XML 名称空间的模式是否实际上是从该位置加载的。也许 MSXML 有一个“内置”版本的 XML 命名空间架构,它不包含这个属性?但我会认为这会破坏太多而无法实现。
我知道这不是一个完整的解决方案,但我希望它能带你前进。
【讨论】:
迈克尔,谢谢你的回答。我会在 S4SD 上了解更多信息。 BTW XMLPad (xmlpad-mobile.com) 可以验证模式。我刚刚从w3schools.com/xml/schema_example.asp 下载了shiporder.xsd,并在XMLPad 的帮助下对其进行了验证。它可以工作(如果我在架构中犯了错误,那么 XMLPad 会抓住它)!!!这意味着可以验证模式。可能是 XMLPad 使用的不是 MSXML 库... 对不起,我应该提到验证模式的最佳方法是将其加载到模式处理器中,而不是使用 schema-for-schema-documents。 S4SD 无法捕获的架构中可能出现许多错误。我错误地认为你知道这一点。 迈克尔,非常感谢。我只会在模式处理器(如 XMLPad)的帮助下制作自己的模式。在我朋友的帮助下,我发现add
方法中的MSXML2.XMLSchemaCache.6.0
可以验证模式。我无法质疑它。我想像疯子一样在 shema for shema XMLSchema.xsd 的帮助下强制 MSXML 像常规 XML 一样验证我的模式。现在我认为没有必要了。以上是关于如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?的主要内容,如果未能解决你的问题,请参考以下文章