2016-02-15 81 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