使用XSD架构实现Xml验证

时间:2014-04-08 06:08:39

标签: c# xml validation

我有一个XSD文件字符串而不是路径,而XML文件字符串不是路径,如何检查XML是否在XSD文件中的正确模式中并检查错误计数并返回所有错误?

1 个答案:

答案 0 :(得分:1)

编辑:回复评论。

我不确定抛出和异常是什么意思?

C#代码对我有效。

这就是我所做的:

1)我将代码保存到此文件中:

C:\Temp\xml_test.cs

2)我在Zeus IDE中编译了代码,它提供了以下编译器输出:

csc.exe /debug /r:System.dll; "C:\Temp\xml_test.cs"

Microsoft (R) Visual C# Compiler version 4.0.30319.18408
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.

3)该编译创建了此xml_test.exe文件。

Directory of c:\temp

09/04/2014  09:30 AM 5,120 xml_test.exe

4)运行xml_test.exe会产生以下输出:

Data at the root level is invalid. Line 1, position 1.

现在步骤4)的输出并不奇怪,因为使用的xml是这样的:

string xmlText = "some xml string";

使用的架构如下:

string xsdText = "some xml schema string";

显然,这不是一个有效的XML字符串或XML模式,结果输出表明了这一点。

第二次编辑:

如果代码更改为使用有效的XML字符串:

// Load the xml string into a memory stream
string xmlText = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" +
                 "<Test>" +
                 "</Test>";

和匹配的架构:

        // Load the schema string into a memory stream
        string xsdText = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
                         "<xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"qualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" +
                         "  <xs:element name=\"Test\" type=\"xs:string\" />" +
                         "</xs:schema>";

然后,代码会在没有错误的情况下验证XML。

第三次编辑:

将此标志添加到设置中以使其调用事件处理程序而不是抛出和异常:

settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

使用此标志可以在加载时验证XML,这意味着也可以删除此调用,因为它只会报告加载报告的相同错误:

document.Validate(eventHandler)

以下原帖:

这样的事情应该有效:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Schema;

class XPathValidation
{
    static void Main() {
        try {
            // Load the schema string into a memory stream
            string xsdText = "some xml schema string";
            MemoryStream xsd = new MemoryStream(Encoding.ASCII.GetBytes(xsdText));

            // create a schema using that memory stream
            ValidationEventHandler eventHandler = new ValidationEventHandler(Validation);
            XmlSchema schema = XmlSchema.Read(xsd, eventHandler);

            // create some settings using that schema
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(schema);
            settings.ValidationType = ValidationType.Schema;

            // Load the xml string into a memory stream
            string xmlText = "some xml string";
            MemoryStream xml = new MemoryStream(Encoding.ASCII.GetBytes(xmlText));

            // create a XML reader
            XmlReader reader = XmlReader.Create(xml, settings);

            // load the XML into a document
            XmlDocument document = new XmlDocument();
            document.Load(reader);

            // validate the XML
            document.Validate(eventHandler);
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }

    static void Validation(object sender, ValidationEventArgs e) {
        switch (e.Severity) {
            case XmlSeverityType.Error:
                Console.WriteLine("Error: {0}", e.Message);
                break;
            case XmlSeverityType.Warning:
                Console.WriteLine("Warning {0}", e.Message);
                break;
        }
    }
}