問題描述
我使用 Visual StudioXML 工具創(chuàng)建了 XSD.我使用以下 C# 代碼來驗證 XML 并遇到此錯誤.
錯誤
<塊引用>元素未聲明'
即使我將 XSD 引用到本地文件,它也不起作用.我看到了同樣的錯誤.
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212 file:///C:/Temp/xmldsig-core-schema.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;嘗試{使用 (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:Tempxmldsig-core-schema.xsd");xdoc.Validate(模式,空);返回真;}}捕獲(XmlSchemaValidationException 前){//扔;}返回假;}
如果您不想將任何內(nèi)容更改為 xsd 或 xml - 請執(zhí)行以下操作:
(可選)從 w3 站點 并保存到本地磁盤.W3 站點非常慢,因為全球許多軟件不斷請求這些模式.如果您將直接使用該 xsd - 您通常會因超時而失敗.一些驗證工具已經(jīng)在本地緩存了此類架構(gòu),但沒有 .NET 驗證器.
通過以下方式從 UPDATE 2 修改您的驗證方法:
public static bool IsValidXml1(string xmlFilePath, string xsdFilePath, string namespaceName){XDocument xdoc = null;var settings = new XmlReaderSettings();settings.DtdProcessing = DtdProcessing.Ignore;嘗試{使用 (XmlReader xr = XmlReader.Create(xmlFilePath, settings)){xdoc = XDocument.Load(xr);var schemas = new XmlSchemaSet();schemas.Add(namespaceName, xsdFilePath);使用 (var fs = File.OpenRead(@"D:Tempxmldsig-core-schema.xsd"))使用 (var reader = XmlReader.Create(fs, new XmlReaderSettings() {DtdProcessing = DtdProcessing.Ignore//重要})) {schemas.Add(@"http://www.w3.org/2000/09/xmldsig#", reader);}xdoc.Validate(模式,空);返回真;}}捕獲(XmlSchemaValidationException 前){//扔;}返回假;}
您必須使用 XmlReader
而不是直接添加該架構(gòu),因為如果您直接添加(如在更新 2 中) - 它將無法解析 DTD 塊,因為當(dāng)您添加 XmlSchema
到 XmlSchemaSet
使用 url(或文件路徑) - 它將使用 XmlReaderSettings
和 DtdProcessing = DtdProcessing.Prohibit
讀取該文件.我們需要將其更改為 DtdProcessing.Ignore
或 DtdProcessing.Parse
.之后,您的驗證方法將適用于目標(biāo) xsd 和 xml 文件,無需任何更改(如果 xml 與 xsd 不匹配,則會正確失敗).
I created XSD using Visual StudioXML Tools. And I use following C# code to validate XML and facing this error.
Error
The element is not declared 'http://www.w3.org/2000/09/xmldsig#:Signature'.
So my question is how to fix it because in edit mode XML is valid 100%?
Thank you!
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
<?xml version="1.0" encoding="utf-8"?>
<Envelope version="1">
<Deposit>
<ClientId>1234567890123</ClientId>
<Account>0045678</Account>
<Currency>USD</Currency>
<Total>5000.00</Total>
<SignedDate>2016-02-15</SignedDate>
<Cheques>
<Cheque>
<Images>
<Front>
SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAfQUAAAEBBAABAAAAWgIAAAIBAwABAAAAAQAA
AAMBAwABAAAABAAAAAYBAwABAAAAAAAAAA4BAgAhAAAA0AAAABEBBAABAAAAAAIAABIBAwABAAAA
AQAAABUBAwABAAAAAQAAABYBBAABAAAAWgIAABcBBAABAAAAvi8AABoBBQABAAAAAAEAABsBBQAB
EdF0fRG0R0YRdH2R2XzaI6OxRQAQAQA=
</Front>
<Back>
SUkqAAgAAAAOAP4ABAABAAAAAAAAAAABBAABAAAAgQUAAAEBBAABAAAAVAIAAAIBAwABAAAAAQAA
AAMBAwABAAAABAAAAAYBAwABAAAAAAAAABEBBAABAAAAAAEAABIBAwABAAAAAQAAABUBAwABAAAA
AQAAABYBBAABAAAAVAIAABcBBAABAAAAcggAABoBBQABAAAAwAAAABsBBQABAAAA0AAAACgBAwAB
AAAAAgAAAAAAAAAAAAAAAAAAAAAAyAAAAAEAAAAAAAAAAAAAAMgAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//LZCdO1f7iRrKXTqt//pePx///9lNoL487Ajh
jFyzUrtwg+6gg9VmvCIWA42XMwziSUEEw7GoIcSUWZ3Y0oKmGR3LToGVC2LhkK6H4sorQNRUMLjH
LTGzlpv3RFCcH4NLB9hvLTmD8tMgOsG+WVaR5AweTcEWMMfaDQxDIx5NwVQx8OMPeGFHLSUlLcSS
1JtNV/9/rrffuO+h9bx////kfvABABAA
</Back>
</Images>
<MicrCodeCmc>123456789012345678901234567890</MicrCodeCmc>
<Amount>465.22</Amount>
<PaymentDate>2016-02-15</PaymentDate>
<EmissionDate>2016-02-15</EmissionDate>
</Cheque>
<Cheque>
<Images>
<Front>
SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAfQUAAAEBBAABAAAAWgIAAAIBAwABAAAAAQAA
AAMBAwABAAAABAAAAAYBAwABAAAAAAAAAA4BAgAhAAAA0AAAABEBBAABAAAAAAIAABIBAwABAAAA
AQAAABUBAwABAAAAAQAAABYBBAABAAAAWgIAABcBBAABAAAAvi8AABoBBQABAAAAAAEAABsBBQAB
EdF0fRG0R0YRdH2R2XzaI6OxRQAQAQA=
</Front>
<Back>
SUkqAAgAAAAOAP4ABAABAAAAAAAAAAABBAABAAAAgQUAAAEBBAABAAAAVAIAAAIBAwABAAAAAQAA
AAMBAwABAAAABAAAAAYBAwABAAAAAAAAABEBBAABAAAAAAEAABIBAwABAAAAAQAAABUBAwABAAAA
AQAAABYBBAABAAAAVAIAABcBBAABAAAAcggAABoBBQABAAAAwAAAABsBBQABAAAA0AAAACgBAwAB
AAAAAgAAAAAAAAAAAAAAAAAAAAAAyAAAAAEAAAAAAAAAAAAAAMgAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//LZCdO1f7iRrKXTqt//pePx///9lNoL487Ajh
jFyzUrtwg+6gg9VmvCIWA42XMwziSUEEw7GoIcSUWZ3Y0oKmGR3LToGVC2LhkK6H4sorQNRUMLjH
LTGzlpv3RFCcH4NLB9hvLTmD8tMgOsG+WVaR5AweTcEWMMfaDQxDIx5NwVQx8OMPeGFHLSUlLcSS
1JtNV/9/rrffuO+h9bx////kfvABABAA
</Back>
</Images>
<MicrCodeCmc>123456789012345678901234567890</MicrCodeCmc>
<Amount>99999999999</Amount>
<PaymentDate>2016-02-15</PaymentDate>
<EmissionDate>2016-02-15</EmissionDate>
</Cheque>
</Cheques>
</Deposit>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>TVO2Gssf5TUdXFYG/PrHDyqYFqs=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>KwQInN03ywa0u0t4HedxgE1fOU7XYLQScKuQ6vdYoIZME5Hm5jpFeX2ORA2U+BO7JNjmFilTW05VntS3k98YCZhNXH9Iw/YEC1nw4JJLzygYbbCftkiY5v5+b494mQPryCtscwTtbziW6QilILSFDGmco2JopRfVe+qfdN/JyB1HXhUfApyNEsw/cJLj6aaz5ivN1sLFgAlikbwCNpF+mRnZY5u7/S8uT8WhEyK32EcatdjzKbP0PwnIlumhOpUMerWeLZ7neuJq6R/IuFgZ1Y5U6ppyuOjhtiHp4glC/uNUS/y7jMzG29thWBkEtSE9AcEt2IZ0HOEZE3kdFXufjA==</SignatureValue>
</Signature>
</Envelope>
XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/ct-required"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime" >
<xs:import namespace="http://www.w3.org/2005/05/xmlmime"
schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
<xs:simpleType name="PNGPictureType"
xmime:expectedContentTypes="image/png">
<xs:restriction base="xs:base64Binary"/>
</xs:simpleType>
<xs:simpleType name="Money">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="13" />
<xs:fractionDigits value="2" />
<xs:minInclusive value="0.00" />
<xs:maxInclusive value="99999999999.99" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Currency">
<xs:annotation>
<xs:documentation>Currency Code: ISO 4217</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="USD" />
<xs:enumeration value="UYU" />
<xs:minLength value="3" />
<xs:maxLength value="3" />
</xs:restriction>
</xs:simpleType>
<xs:element name="Envelope">
<xs:complexType>
<xs:sequence>
<xs:element name="Deposit" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="ClientId" type="xs:unsignedLong" />
<xs:element name="Account" type="xs:unsignedLong" />
<xs:element name="Currency" type="Currency" />
<xs:element name="Total" type="Money" />
<xs:element name="SignedDate" type="xs:date" />
<xs:element name="Cheques">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Cheque">
<xs:complexType>
<xs:sequence>
<xs:element name="Images">
<xs:complexType>
<xs:sequence>
<xs:element name="Front" type="PNGPictureType" />
<xs:element name="Back" type="PNGPictureType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="MicrCodeCmc" type="xs:string" />
<xs:element name="Amount" type="Money" />
<xs:element name="PaymentDate" type="xs:date" />
<xs:element name="EmissionDate" type="xs:date" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element xmlns:q1="http://www.w3.org/2000/09/xmldsig#" ref="q1:Signature" />
</xs:sequence>
<xs:attribute name="version" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
UPDATE #1
I have tried different approaches but no joy.
And even if I reference XSD to local file it does not work. I see the same error.
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212 file:///C:/Temp/xmldsig-core-schema.xsd"/>
UPDATE #2
Even I use this approach no joy.
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:Tempxmldsig-core-schema.xsd");
xdoc.Validate(schemas, null);
return true;
}
}
catch (XmlSchemaValidationException ex)
{
// throw;
}
return false;
}
If you don't want to change anything to xsd or xml - do the following:
(optional) Download xsd from w3 site and save to local disk. W3 site is VERY slow because a lot of software worldwide constantly request those schemas. If you will use that xsd directly - you will often fail by timeout. Some validation tools already have such schemas cached locally, but not .NET validator.
Modify your validation method from UPDATE 2 the following way:
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:Tempxmldsig-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; }
You have to add that schema using XmlReader
and not directly, because if you add directly (like in your update 2) - it will fail to parse DTD block, because when you add XmlSchema
to XmlSchemaSet
using url (or file path) - it will read that file using XmlReaderSettings
with DtdProcessing = DtdProcessing.Prohibit
. We need to change that to DtdProcessing.Ignore
or DtdProcessing.Parse
. After that your validation method will work fine for target xsd and xml file, without any changes (and will correctly fail in case xml does not match xsd).
這篇關(guān)于未聲明 XML 簽名元素的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!