2012-01-16 74 views
3

我需要儘可能快地驗證並接收套接字上的下一個xml數據。有效的方法來驗證XML?

我使用這種方法來驗證收到的xml數據。

private validateRecievedXmlCallback() 
{ 
    try 
    {  
    XmlReader xreader = XmlReader.Create(new StringReader(xmlData)); 
    while (xreader.Read()) ; 
    } 
    catch (Exception) 
    { 
    return false; 
    } 

    return true; 
} 

但我認爲這種方法效率不夠高。我其實只需要檢查最後一個標籤。

例如:

<test valueA="1" valueB="2"> 
    <data valueC="1" /> 
    <data valueC="5" /> 
    <data valueC="5">220</data> 
</test> //I need to check if </test> tag closed, but whats the best way to do it? 
+0

所以,讓我看看......你需要檢查字符串中是否存在'',對吧? – vzwick 2012-01-16 21:25:00

+0

是的,但我不想使用子字符串,因爲它可能發生 Racooon 2012-01-16 21:25:59

+0

爲什麼選擇投票?這只是一個問題? – Racooon 2012-01-16 21:27:09

回答

6

如果你堅持使用XmlReader,你可以使用XmlReader.Skip(),它跳過當前元素的內容。

所以

xreader.ReadStartElement("test"); // moves to document root, throws if it is not <test> 
xreader.Skip(); // throws if document is not well-formed, e.g. root has no closing tag. 

正如其他評論者已經指出的那樣,有一個保證XML文檔的區別在於使用XML解析器良好性的好方法。

+0

所以upvoted。您的答案應該有複選標記。 – vzwick 2012-01-16 22:04:08

1

實際上任何人都面臨着同樣的挑戰,因爲OP:參考the answer by Sven Künzler和從來沒有想過再打造自己的XML「驗證」。


編輯:新增自閉標籤的正則表達式檢查。

EDIT2:製造正則表達式實際上做什麼它應該

EDIT3:編輯雙重封閉的標記檢查(帽尖到RichardW1001

private validateRecievedXmlCallback(IAsyncResult ar) 
{ 
    string sPattern = @"^<test([^>]*) \/>$"; 
    if (System.Text.RegularExpressions.Regex.IsMatch(xmlData, sPattern)) 
    { 
     return(true); 
    } 

    int first_occurence = xmlData.IndexOf("</test>"); 
    int last_occurence = xmlData.LastIndexOf("</test>"); 
    return((first_occurence != -1) && (first_occurence == last_occurence)); 
} 

免責聲明:它通常是通過正則表達式,IndexOf()或任何其他「本土」方法嘗試和「驗證」XML的愚蠢想法。只需使用適當的XML解析器即可。

+0

謝謝,Xml解析器正在讀取每一行,但我不需要驗證每個屬性或元素。我只需要知道它是否符合。 – Racooon 2012-01-16 21:34:31

+0

這就是您擁有免責聲明的原因,但如果結束標記是雙關閉的,那麼該怎麼辦? – RichardW1001 2012-01-16 21:53:43

+0

@ RichardW1001呃......恐怕我不明白「雙關」是什麼意思。你願意提供一個例子嗎? – vzwick 2012-01-16 21:55:44