2012-01-16 13 views
3

できるだけ早く検証し、次のxml-dataをソケットで受け取る必要があります。xmlを効率的に検証する方法は?

私はこのメソッドを使用して、受信したxml-datasを検証しています。

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

+0

はい、しかし、私は起こる可能性があるので、部分文字列を使用したくありません。 – Racooon

+0

なぜ投票が下りますか?これは単なる質問ですか? – Racooon

答えて

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

1

実際にはOPと同じ挑戦直面誰でも:the answer by Sven Künzlerを参照してください、決して再び独自のXML「検証」を構築する考えを。


編集:追加の自己終了タグの正規表現チェック。

EDIT2:編集ダブル閉じタグのチェック

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)); 
} 

免責事項(RichardW1001に帽子の先端):それを製正規表現は、実際にそれが

EDIT3になっています何をすべきか正規表現、IndexOf()または他の "自家製"の方法でXMLを試して "検証"するのは、一般的に愚かな考えです。適切なXMLパーサーを使用してください。

+0

ありがとう、Xmlパーサーはすべての行を読み込んでいますが、私は各属性を検証する必要はありませんまたは要素。私はそれが複雑かどうかを知る必要があります。 – Racooon

+0

これはあなたの免責事項を持っている理由ですが、終了タグが二重に閉じられた場合はどうなりますか? – RichardW1001

+0

@ RichardW1001ええと...私はあなたが「二重閉鎖」という意味を理解していないのは残念です。あなたは例を提供したいですか? – vzwick

関連する問題