首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同类型的XML验证

不同类型的XML验证
EN

Stack Overflow用户
提问于 2016-04-28 15:18:48
回答 1查看 485关注 0票数 0

我正在研究一些可以验证XML的东西,我们是针对XSD发送的。我遇到过这三种情况,但似乎只有一种是“起作用”--我猜想有一个原因会导致一个问题,而其他人却不想知道,除了这三种方法的工作方式之外,什么是最好的方法和不同之处。

XML

代码语言:javascript
运行
复制
    <?xml version="1.0" encoding="UTF-8"?>
<Person>
    <Forename>John</Forename>
</Person>

XSD

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" version="0.2">
  <xs:annotation>
    <xs:documentation>
    </xs:documentation>
  </xs:annotation>
  <xs:element name ="Person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Forename" type="xs:string"/>
        <xs:element name="Surname" type="xs:string"/>
        <xs:element name="Middlename" type="xs:string" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
  </xs:element>
</xs:schema>

第一个标志是预期的姓氏元素的错误,但不是我所期望的XML中的错误。

代码语言:javascript
运行
复制
class XPathValidation
    {
        static void Main()
        {
            XmlSchemaSet schemas = new XmlSchemaSet();
            schemas.Add("", XmlReader.Create(@"C:\test\test.xsd"));

            XDocument doc = XDocument.Load(@"C:\test\test.xml");



            Console.WriteLine("Validating doc1");
            bool errors = false;
            doc.Validate(schemas, (o, e) =>
            {
                Console.WriteLine("{0}", e.Message);
                errors = true;
            });
            Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");

            Console.ReadKey();
        }


    }

这两个人都跑了,什么也没回。

代码语言:javascript
运行
复制
class XmlSchemaSetExample
    {
        static void Main()
        {
            XmlReaderSettings booksSettings = new XmlReaderSettings();
            booksSettings.Schemas.Add("http://www.w3.org/2001/XMLSchema", @"C:\test\test.xsd");
            booksSettings.ValidationType = ValidationType.Schema;
            booksSettings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler);

            XmlReader books = XmlReader.Create(@"C:\test\test.xml", booksSettings);

            while (books.Read()) { }

            Console.ReadKey();
        }

        static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
        {
            if (e.Severity == XmlSeverityType.Warning)
            {
                Console.Write("WARNING: ");
                Console.WriteLine(e.Message);
            }
            else if (e.Severity == XmlSeverityType.Error)
            {
                Console.Write("ERROR: ");
                Console.WriteLine(e.Message);
            }
        }
    }

代码语言:javascript
运行
复制
class XPathValidation
{
    static void Main()
    {
        try
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add("http://www.w3.org/2001/XMLSchema", @"C:\test\test.xsd");
            settings.ValidationType = ValidationType.Schema;

            XmlReader reader = XmlReader.Create(@"C:\test\test.xml", settings);
            XmlDocument document = new XmlDocument();
            document.Load(reader);

            ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);

            // the following call to Validate succeeds.
            document.Validate(eventHandler);


            // the document will now fail to successfully validate
            document.Validate(eventHandler);

            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    static void ValidationEventHandler(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;
        }

    }
}

谢谢你的信息,还在学习这一切。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-28 15:32:27

我可以想象第二个方法不起作用,因为当您将模式添加到targetNamespace中时,您为XmlReaderSettings提供了一个不正确的值。这应该是一个空字符串,因为您的XML没有名称空间(或者null,作为按照医生的说法 )。

至于哪个更好,这取决于你的要求是什么。如果只是为了验证它,则首选使用XmlReader的选项2,因为它不会牺牲将整个XML加载到DOM中的代价,然后将DOM丢弃。

如果您确实需要使用DOM查询XML,则XDocument / LINQ (选项1)比旧的XmlDocument API (选项3)要好得多、更现代。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36918896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档