"Type 'http://www.w3.org/2000/09/xmldsig#:SignatureType' is not declared" 在 XmlDocument.Validate(...)
"Type 'http://www.w3.org/2000/09/xmldsig#:SignatureType' is not declared" in XmlDocument.Validate(...)
我有这个非常简单的 XSD 模式
<?xml version = "1.0" encoding = "UTF-8"?>
<schema xmlns = "http://www.w3.org/2001/XMLSchema"
targetNamespace = "http://my.domain/xmlschemas/message"
xmlns:mmm = "http://my.domain/xmlschemas/message"
xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
elementFormDefault = "qualified">
<import namespace = "http://www.w3.org/2000/09/xmldsig#" schemaLocation = "xmldsig-core-schema.xsd"/>
<element name = "message">
<complexType>
<sequence>
<element name = "Signature" type = "ds:SignatureType" minOccurs = "0" maxOccurs = "unbounded"/>
</sequence>
</complexType>
</element>
</schema>
存储为我的 Visual Studio 2010 C# 项目以及我从 www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd
下载的 xmldsig-core-schema.xsd
的嵌入式资源。
我想根据此 XSD 模式验证我的文档。我的文档:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://my.domain/xmlschemas/message">
</message>
我用XmlDocument.Validate(...)
方法验证是这样的:
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(inputStream); //XML document loads correctly...
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream("XmlSigTest.Resources.message.xsd"))
{
XmlSchema schema = XmlSchema.Read(schemaStream, null);
doc.Schemas.Add(schema); //XSD schema loads correctly
}
bool ok = true;
doc.Validate((s, e) => //throws Exception!!!
{
ok = false;
});
此代码在 doc.Validate(...)
中引发异常,消息为:Type 'http://www.w3.org/2000/09/xmldsig#:SignatureType' is not declared
。但是,Visual Studio XML 编辑器中没有警告或错误,我可以在 Visual Studio XML 模式资源管理器中看到 SignatureType
。为什么抛出这个异常?我该怎么办?
我自己解决了这个问题。我的这行 XSD 没有很好地工作:
<import namespace = "http://www.w3.org/2000/09/xmldsig#" schemaLocation = "xmldsig-core-schema.xsd"/>
我认为 doc.Validate(...)
会自动下载或查找所有引用的外部架构。 (xmldsig-core-schema.xsd
在我的例子中)。嗯……不会的。
我不得不手动将引用的架构添加到 doc.Schemas
,从那以后就没问题了。
结果代码:
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(inputStream);
Assembly myAssembly = Assembly.GetExecutingAssembly();
foreach (string resource in new string[] {"message.xsd", "xmldsig-core-schema.xsd"}) {
using (Stream schemaStream = myAssembly.GetManifestResourceStream("XmlSigTest.Resources." + resource))
{
XmlSchema schema = XmlSchema.Read(schemaStream, null);
doc.Schemas.Add(schema);
}
}
bool ok = true;
doc.Validate((s, e) =>
{
ok = false;
});
我有这个非常简单的 XSD 模式
<?xml version = "1.0" encoding = "UTF-8"?>
<schema xmlns = "http://www.w3.org/2001/XMLSchema"
targetNamespace = "http://my.domain/xmlschemas/message"
xmlns:mmm = "http://my.domain/xmlschemas/message"
xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
elementFormDefault = "qualified">
<import namespace = "http://www.w3.org/2000/09/xmldsig#" schemaLocation = "xmldsig-core-schema.xsd"/>
<element name = "message">
<complexType>
<sequence>
<element name = "Signature" type = "ds:SignatureType" minOccurs = "0" maxOccurs = "unbounded"/>
</sequence>
</complexType>
</element>
</schema>
存储为我的 Visual Studio 2010 C# 项目以及我从 www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd
下载的 xmldsig-core-schema.xsd
的嵌入式资源。
我想根据此 XSD 模式验证我的文档。我的文档:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://my.domain/xmlschemas/message">
</message>
我用XmlDocument.Validate(...)
方法验证是这样的:
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(inputStream); //XML document loads correctly...
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream("XmlSigTest.Resources.message.xsd"))
{
XmlSchema schema = XmlSchema.Read(schemaStream, null);
doc.Schemas.Add(schema); //XSD schema loads correctly
}
bool ok = true;
doc.Validate((s, e) => //throws Exception!!!
{
ok = false;
});
此代码在 doc.Validate(...)
中引发异常,消息为:Type 'http://www.w3.org/2000/09/xmldsig#:SignatureType' is not declared
。但是,Visual Studio XML 编辑器中没有警告或错误,我可以在 Visual Studio XML 模式资源管理器中看到 SignatureType
。为什么抛出这个异常?我该怎么办?
我自己解决了这个问题。我的这行 XSD 没有很好地工作:
<import namespace = "http://www.w3.org/2000/09/xmldsig#" schemaLocation = "xmldsig-core-schema.xsd"/>
我认为 doc.Validate(...)
会自动下载或查找所有引用的外部架构。 (xmldsig-core-schema.xsd
在我的例子中)。嗯……不会的。
我不得不手动将引用的架构添加到 doc.Schemas
,从那以后就没问题了。
结果代码:
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(inputStream);
Assembly myAssembly = Assembly.GetExecutingAssembly();
foreach (string resource in new string[] {"message.xsd", "xmldsig-core-schema.xsd"}) {
using (Stream schemaStream = myAssembly.GetManifestResourceStream("XmlSigTest.Resources." + resource))
{
XmlSchema schema = XmlSchema.Read(schemaStream, null);
doc.Schemas.Add(schema);
}
}
bool ok = true;
doc.Validate((s, e) =>
{
ok = false;
});