2016-02-15 80 views
1

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

的模式:
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文件来验证:
有效.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> 
+3

您的模式描述了“http:// tempuri.org/XMLSchemaError.xsd”中的元素。您的XML片段都不会声称在任何名称空间中(即,既不使用任何'xmlns'属性) –

+0

好吧。我对XML很陌生,所以你能告诉我如何将该名称空间属性添加到XML文件以使其工作? – Kailayla

回答

2

正如评论者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执行同样的操作,您会发现它也无法通过验证。这是由于两个原因:

  1. 模式拼写单词“发生”,而XML没有。这可以通过更正模式拼写或使用XML中的拼写错误来解决。
  2. 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 :))。

+0

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