无效的XML有效

时间:2016-02-15 14:39:27

标签: c# xml validation

我已经制作了一个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>

1 个答案:

答案 0 :(得分:2)

正如评论者Damien_The_Unbeliever所指出的那样,由于您的XML并未声明包含由相关模式验证的任何元素,因此这两个文档都会通过验证。他们没有任何东西可以验证。

有多种方法可以纠正这种情况。最简单的方法是只向源元素添加一个默认的XML命名空间。 E.g:

<?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执行相同的操作,您会发现它也无法通过验证。这有两个原因:

  1. 架构拼错了“发生”这个词,而XML却没有。这可以通过更正模式的拼写或使用XML中的拼写错误来解决。
  2. XML的格式dateTime格式不正确。仅使用一个数字指定日期字段,但XML格式要求月份和日期字段都有两位数字。
  3. 考虑到您提供的架构,实际有效的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 :)。