未声明XML签名元素

我使用Visual StudioXML工具创建了XSD。 我使用以下C#代码来validationXML并面临此错误。

错误

该元素未声明为“ http://www.w3.org/2000/09/xmldsig#:Signature ”。

所以我的问题是如何解决它,因为在编辑模式下,XML有效100%?

谢谢!

C#

private void buttonValidateXML_Click(object sender, EventArgs e) { try { bool result = IsValidXml2(textBoxSignedXML.Text, textBoxXSDFile.Text, ""); rtbValidationResult.Text = result.ToString(); } catch (Exception ex) { rtbValidationResult.Text = ex.Message; } } public static bool IsValidXml2(string xmlFilePath, string xsdFilePath, string namespaceName) { var xdoc = XDocument.Load(xmlFilePath); var schemas = new XmlSchemaSet(); schemas.Add(namespaceName, xsdFilePath); bool result = true; xdoc.Validate(schemas, (sender, e) => { result = false; }); return result; } 

XML

    1234567890123 0045678 USD 5000.00 2016-02-15     SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAfQUAAAEBBAABAAAAWgIAAAIBAwABAAAAAQAA AAMBAwABAAAABAAAAAYBAwABAAAAAAAAAA4BAgAhAAAA0AAAABEBBAABAAAAAAIAABIBAwABAAAA AQAAABUBAwABAAAAAQAAABYBBAABAAAAWgIAABcBBAABAAAAvi8AABoBBQABAAAAAAEAABsBBQAB EdF0fRG0R0YRdH2R2XzaI6OxRQAQAQA=   SUkqAAgAAAAOAP4ABAABAAAAAAAAAAABBAABAAAAgQUAAAEBBAABAAAAVAIAAAIBAwABAAAAAQAA AAMBAwABAAAABAAAAAYBAwABAAAAAAAAABEBBAABAAAAAAEAABIBAwABAAAAAQAAABUBAwABAAAA AQAAABYBBAABAAAAVAIAABcBBAABAAAAcggAABoBBQABAAAAwAAAABsBBQABAAAA0AAAACgBAwAB AAAAAgAAAAAAAAAAAAAAAAAAAAAAyAAAAAEAAAAAAAAAAAAAAMgAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//LZCdO1f7iRrKXTqt//pePx///9lNoL487Ajh jFyzUrtwg+6gg9VmvCIWA42XMwziSUEEw7GoIcSUWZ3Y0oKmGR3LToGVC2LhkK6H4sorQNRUMLjH LTGzlpv3RFCcH4NLB9hvLTmD8tMgOsG+WVaR5AweTcEWMMfaDQxDIx5NwVQx8OMPeGFHLSUlLcSS 1JtNV/9/rrffuO+h9bx////kfvABABAA   123456789012345678901234567890 465.22 2016-02-15 2016-02-15     SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAfQUAAAEBBAABAAAAWgIAAAIBAwABAAAAAQAA AAMBAwABAAAABAAAAAYBAwABAAAAAAAAAA4BAgAhAAAA0AAAABEBBAABAAAAAAIAABIBAwABAAAA AQAAABUBAwABAAAAAQAAABYBBAABAAAAWgIAABcBBAABAAAAvi8AABoBBQABAAAAAAEAABsBBQAB EdF0fRG0R0YRdH2R2XzaI6OxRQAQAQA=   SUkqAAgAAAAOAP4ABAABAAAAAAAAAAABBAABAAAAgQUAAAEBBAABAAAAVAIAAAIBAwABAAAAAQAA AAMBAwABAAAABAAAAAYBAwABAAAAAAAAABEBBAABAAAAAAEAABIBAwABAAAAAQAAABUBAwABAAAA AQAAABYBBAABAAAAVAIAABcBBAABAAAAcggAABoBBQABAAAAwAAAABsBBQABAAAA0AAAACgBAwAB AAAAAgAAAAAAAAAAAAAAAAAAAAAAyAAAAAEAAAAAAAAAAAAAAMgAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//LZCdO1f7iRrKXTqt//pePx///9lNoL487Ajh jFyzUrtwg+6gg9VmvCIWA42XMwziSUEEw7GoIcSUWZ3Y0oKmGR3LToGVC2LhkK6H4sorQNRUMLjH LTGzlpv3RFCcH4NLB9hvLTmD8tMgOsG+WVaR5AweTcEWMMfaDQxDIx5NwVQx8OMPeGFHLSUlLcSS 1JtNV/9/rrffuO+h9bx////kfvABABAA   123456789012345678901234567890 99999999999 2016-02-15 2016-02-15             TVO2Gssf5TUdXFYG/PrHDyqYFqs=   KwQInN03ywa0u0t4HedxgE1fOU7XYLQScKuQ6vdYoIZME5Hm5jpFeX2ORA2U+BO7JNjmFilTW05VntS3k98YCZhNXH9Iw/YEC1nw4JJLzygYbbCftkiY5v5+b494mQPryCtscwTtbziW6QilILSFDGmco2JopRfVe+qfdN/JyB1HXhUfApyNEsw/cJLj6aaz5ivN1sLFgAlikbwCNpF+mRnZY5u7/S8uT8WhEyK32EcatdjzKbP0PwnIlumhOpUMerWeLZ7neuJq6R/IuFgZ1Y5U6ppyuOjhtiHp4glC/uNUS/y7jMzG29thWBkEtSE9AcEt2IZ0HOEZE3kdFXufjA==   

XSD

                  Currency Code: ISO 4217                                                     

更新#1

我尝试了不同的方法,但没有快乐。

在此处输入图像描述

即使我将XSD引用到本地文件,它也不起作用。 我看到同样的错误。

   

更新#2

即使我用这种方法也没有乐趣。

  public static bool IsValidXml1(string xmlFilePath, string xsdFilePath, string namespaceName) { XDocument xdoc = null; var settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Ignore; settings.ProhibitDtd = false; try { using (XmlReader xr = XmlReader.Create(xmlFilePath, settings)) { xdoc = XDocument.Load(xr); var schemas = new XmlSchemaSet(); schemas.Add(namespaceName, xsdFilePath); schemas.Add(@"http://www.w3.org/2000/09/xmldsig#", @"D:\Temp\xmldsig-core-schema.xsd"); xdoc.Validate(schemas, null); return true; } } catch (XmlSchemaValidationException ex) { // throw; } return false; } 

如果您不想将任何内容更改为xsd或xml – 请执行以下操作:

  1. (可选)从w3站点下载xsd并保存到本地磁盘。 W3网站非常慢,因为世界各地的许多软件都在不断地请求这些模式。 如果您将直接使用该xsd – 您将经常因超时而失败。 一些validation工具已经在本地缓存了这样的模式,但不是.NETvalidation器。

  2. 通过以下方式从UPDATE 2修改validation方法:

     public static bool IsValidXml1(string xmlFilePath, string xsdFilePath, string namespaceName) { XDocument xdoc = null; var settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Ignore; try { using (XmlReader xr = XmlReader.Create(xmlFilePath, settings)) { xdoc = XDocument.Load(xr); var schemas = new XmlSchemaSet(); schemas.Add(namespaceName, xsdFilePath); using (var fs = File.OpenRead(@"D:\Temp\xmldsig-core-schema.xsd")) using (var reader = XmlReader.Create(fs, new XmlReaderSettings() { DtdProcessing = DtdProcessing.Ignore // important })) { schemas.Add(@"http://www.w3.org/2000/09/xmldsig#", reader); } xdoc.Validate(schemas, null); return true; } } catch (XmlSchemaValidationException ex) { // throw; } return false; } 

你必须使用XmlReader而不是直接添加该模式,因为如果直接添加(如在更新2中) – 它将无法解析DTD块,因为当您使用url(或文件路径)将XmlSchema添加到XmlSchemaSet – 它将使用带有DtdProcessing = DtdProcessing.Prohibit XmlReaderSettings读取该文件。 我们需要将其更改为DtdProcessing.IgnoreDtdProcessing.Parse 。 之后,您的validation方法将适用于目标xsd和xml文件,无需任何更改(并且在xml与xsd不匹配时将正确失败)。

你很近。 在您的XSD中,只需更换,

  

  

并且您的XSD将不再出现该错误,并且您的XML将对您的XSD有效。

说明

XSD可以通过xs:importxs:include 。 在这两种情况下,必须使用必需的schemaLocation属性指定引用的XSD的位置,该属性在OP的原始XSD中缺失。 通过添加xs:import/@schemaLocation如上所示,消除了错误。


更新#1:

当你切换到使用本地XSD时,你在xs:import犯了一个错误:

更改

   

   

(您正在关注具有命名空间位置对的 XML文档中的@xsi:schemaLocation示例; xs:import/@schemaLocation不同。)


更新#2:

所以我的问题是如何解决它,因为在编辑模式下,XML有效100%?

也许这就是脱节。 在Visual Studio中编辑XML文件不会自动根据XSD对其进行validation。 您需要在代码中或通过validationXML编辑器(如Oxygen XML Editor或XML Spy)执行此操作 。

此外,您的C#validation代码可能存在问题。 请参阅在C#中针对引用的XSDvalidationXML