輸入是xml作爲字符串,我有一個XSD模式來驗證。在.NET 3.5中對模式進行驗證時加載XDocument
我希望在將xml加載到XDocument(因爲我需要使用Linq進行分析後加載xml文件)時驗證xml是否針對XSD模式。
任何人都有一個小的代碼片段?
輸入是xml作爲字符串,我有一個XSD模式來驗證。在.NET 3.5中對模式進行驗證時加載XDocument
我希望在將xml加載到XDocument(因爲我需要使用Linq進行分析後加載xml文件)時驗證xml是否針對XSD模式。
任何人都有一個小的代碼片段?
加載文檔,然後使用XDocument.Validate
,傳入XmlSchemaSet
以表示要驗證的模式,並使用ValidationEventHandler
對任何驗證問題作出適當的反應。
有一個MSDN article有一個完整的例子和討論。
只是關於上述答案的說明。這是正確的,但可能會令人困惑。 XDocument.Validate是存在於System.Xml.Schema命名空間中的擴展方法。如果你不使用這個命名空間,那麼Validate方法將不會出現在intellisense中。我以爲我會幫助那些和我一樣困惑的人。 :)
所以代碼在這裏。
喬恩長柄水杓答案和MSDN http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.validate.aspx
var xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
var schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
var doc1 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child2", "content1")
)
);
var doc2 = new XDocument(
new XElement("Root",
new XElement("Child1", "content1"),
new XElement("Child3", "content1")
)
);
Console.WriteLine("Validating doc1");
var errors = false;
doc1.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");
Console.WriteLine();
Console.WriteLine("Validating doc2");
errors = false;
doc2.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");
我有XSD文件,使用`VAR流=新的StreamReader(pathXSD)`***不工作*** – Kiquenet 2017-03-06 15:31:36