如何使用 MSXML 再次验证我自己的架构 XSD 文件 XMLSchema.xsd?
How to validate my own Schema XSD file againts XMLSchema.xsd using MSXML?
- 我使用 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...
}
首先,模式文档的 W3C 模式 (S4SD) 做了一些在用户模式中不允许的事情,比如定义新的原始类型,所以不能保证每个模式处理器都会认为它是有效的模式。我不知道 MSXML 是否有问题(虽然它相当古老和受人尊敬...)
您遇到的具体问题似乎是 S4SD 导入了 XML 命名空间的架构
而且您似乎选择了一个未声明 [=21=] 的模式版本。我不知道为什么会这样;可能值得进行某种监视以查看 XML 名称空间的架构是否实际上是从该位置加载的。也许 MSXML 的 XML 命名空间的模式 "built-in" 版本不包含此属性?但我原以为那会破坏太多而无法实现。
我知道这不是一个完整的解决方案,但我希望它能带你前进。
- 我使用 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...
}
首先,模式文档的 W3C 模式 (S4SD) 做了一些在用户模式中不允许的事情,比如定义新的原始类型,所以不能保证每个模式处理器都会认为它是有效的模式。我不知道 MSXML 是否有问题(虽然它相当古老和受人尊敬...)
您遇到的具体问题似乎是 S4SD 导入了 XML 命名空间的架构
而且您似乎选择了一个未声明 [=21=] 的模式版本。我不知道为什么会这样;可能值得进行某种监视以查看 XML 名称空间的架构是否实际上是从该位置加载的。也许 MSXML 的 XML 命名空间的模式 "built-in" 版本不包含此属性?但我原以为那会破坏太多而无法实现。
我知道这不是一个完整的解决方案,但我希望它能带你前进。