在.NET 3.5中验证模式时加载XDocument

时间:2009-05-05 07:31:30

标签: .net

输入是xml作为字符串,我有一个XSD架构来验证。

我希望在将xml加载到XDocument时对XSD架构验证xml(因为之后我需要使用Linq进行解析)。

任何人都有一个小代码段吗?

3 个答案:

答案 0 :(得分:20)

加载文档,然后使用XDocument.Validate,传入XmlSchemaSet表示要验证的模式,并ValidationEventHandler对任何验证问题作出适当的反应。< / p>

MSDN article的完整示例和讨论。

答案 1 :(得分:15)

只是关于上述答案的说明。这是正确的,但可能会令人困惑。 XDocument.Validate是System.Xml.Schema命名空间中存在的扩展方法。如果不使用此命名空间,则Validate方法将不会出现在intellisense中。我以为我会帮助那些和我一样迷茫的人。 :)

答案 2 :(得分:2)

所以代码在这里。

来自Jon Skeets的回答和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");