无效的 XML 显示为有效

Posted

技术标签:

【中文标题】无效的 XML 显示为有效【英文标题】:Invalid XML comes out as valid 【发布时间】:2016-02-15 14:39:27 【问题描述】:

我已经创建了一个 XML 模式来验证传入的 xml 文件,以验证它们是否是错误。 我有一些代码应该在 xml 文件有效时返回 true,或者在无效时返回 false。 我还制作了两个 XML 文件,其中一个有效,另一个无效。但是,我的代码对它们都返回 true,也就是认为它们都有效。怎么会?我哪里做错了?

架构:XMLSchemaError.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchemaError"
    targetNamespace="http://tempuri.org/XMLSchemaError.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchemaError.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchemaError.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="Error">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Server_ID" type="xs:integer" />
        <xs:element name="Prioritizing" type="xs:token" />
        <xs:element name="Type" type="xs:token" />
        <xs:element name="Thrown_by" type="xs:token" />
        <xs:element name="Code" type="xs:string" />
        <xs:element name="Text" type="xs:string" />
        <xs:element name="Time_occured" type="xs:dateTime" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

验证 XML 文件的代码:XMLValidation.cs

private bool isValid = false;       

public bool checkValid(string fileName)

    try
    
        var reader = XmlReader.Create("../../XMLFiles/" + fileName);
        XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.Load(reader);
        doc.Schemas.Add(null, "../../Model/XMLSchemaError.xsd");
        doc.Validate(ValidationCallBack);
        isValid = true;
    
    catch
    
        isValid = false;
                
    System.Diagnostics.Debug.WriteLine("Check: " + isValid);
    return isValid;


private void ValidationCallBack(object sender, ValidationEventArgs e)

    throw new Exception();

要验证的 2 个 XML 文件:Valid.xml

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Server_ID>4</Server_ID>
    <Prioritizing>major</Prioritizing>
    <Type>test error</Type>
    <Thrown_by>test program</Thrown_by>
    <Code></Code>
    <Text></Text>
    <Time_occurred>2016-02-9T12:34:56.7890</Time_occurred>
</Error>

Invalid.xml

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

【问题讨论】:

您的架构描述了http://tempuri.org/XMLSchemaError.xsd 中的元素。您的任何 XML 都没有声称在任何命名空间中(即不使用任何 xmlns 属性) 好的。我对 XML 很陌生,你能告诉我如何将命名空间属性添加到 XML 文件中以使其工作吗? 【参考方案1】:

正如评论者Damien_The_Unbeliever 指出的那样,由于您的 XML 没有声称包含任何由相关架构验证的元素,因此这两个文档都可以轻松通过验证。他们没有什么可以验证的。

有多种方法可以纠正这种情况。最简单的方法是将默认 XML 命名空间添加到根元素。例如:

<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://tempuri.org/XMLSchemaError.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

完成后,上面的 XML 现在将根据您的架构验证失败。

如果您要对“有效”的 XML 执行相同的操作,您会发现它也无法通过验证。这有两个原因:

    架构拼错了单词“occurrred”,而 XML 没有。这可以通过更正架构的拼写或使用 XML 中的拼写错误来解决。 XML 的dateTime 值格式不正确。日期字段仅使用一位数字指定,但 XML 格式要求月份和日期字段都使用两位数字。

根据您提供的架构,实际有效的 XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Error xmlns="http://tempuri.org/XMLSchemaError.xsd">
    <Server_ID>4</Server_ID>
    <Prioritizing>major</Prioritizing>
    <Type>test error</Type>
    <Thrown_by>test program</Thrown_by>
    <Code></Code>
    <Text></Text>
    <Time_occured>2016-02-09T12:34:56.7890</Time_occured>
</Error>

(我选择拼错 XML 中的元素名称,而不是修复架构,只是因为它简化了此答案中所需的示例 XML :))。

【讨论】:

谢谢,这不仅解决了问题,而且我现在明白我做错了什么:)

以上是关于无效的 XML 显示为有效的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 返回有效时 XML 无效

jquery Datatable 无效 JSON 响应 1 ,数据被检查为有效 json

有效负载中指定的无效资源的 HTTP 状态代码

“大于”有效但“小于”无效?

显示报告时跳过无效日期

使用 IPython.display.image 显示来自网络的图像:有时有效,有时无效