2010-12-06 10 views
1

私は思ったように、これは特定のノードを検索するための素敵な一般的な方法になるだろう、いくつかのコードを書いただけです。私が終わったとき、私は実際にそれが混乱気づいた:Dノードリストをナビゲートするコードを書き直す方法

私が何を意図したもの
public String sqlReading(String fileName, String path, String nodeId) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(fileName); 

    XmlNodeList names = doc.SelectNodes(path); 
    foreach (XmlNode xmlDocSearchTerm in names) 
    { 
     //if the attribute of the node i start at is the same as where i am now 
     if (xmlDocSearchTerm.Attributes.Item(0).Value.ToString().Equals(nodeId)) 
     { 
      //get a list of all of its child nodes 
      XmlNodeList childNodes = xmlDocSearchTerm.ChildNodes; 

      foreach (XmlNode node in childNodes) 
      { 
       //if there is a node in here called gui display, go inside 
       if (node.Name.Equals("GUIDisplay")) 
       { 
        XmlNodeList list = node.ChildNodes; 
        //find the sqlsearchstring tag inside of here 
        foreach (XmlNode finalNode in list) 
        { 
         if (finalNode.Name.Equals("sqlSearchString")) 
         { 
          return node.InnerText; 
         } 
        } 
       } 
      } 
     } 
    } 
    return ""; 
} 

はパスに基づいていた - それならば、私は、開始と要素は私が探していたIDを持っていたかどうかをチェックします私はそこに入って、2つのレベルをより深く埋めるsqlsearchstringタグに到達するまで行きたくありませんでした。私はそれを管理しましたが、ここでの問題は、そこにループすることに反対するタグのパスをほとんどハードコーディングしているようです。私はこれをやめないようにコードを変更することができますか?

その2番目のforeachからどこが間違っているか。

おかげ

+0

XPathでは、すべての 'foreach'ループを1行で置き換えることができると思います –

+2

XPathをお探しですか?http://support.microsoft.com/kb/308333 – dsolimano

+0

XPathについて聞いたことがありますか? – mjv

答えて

1

がそれをテストしていないが、私はこのような何かがうまくいくと信じてかどうかわかりませんしかし、私は属性の名前がわからない、あるいは常に最初の属性ですか?

public String sqlReading(String fileName, String path, String nodeId) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(fileName); 

    XmlNode foundNode = doc.SelectNodes(path).SelectSingleNode("*[@id='" + nodeId + "']/GUIDisplay/sqlSearchString"); 
    if (foundNode != null) 
     return foundNode.InnerText; 
    return string.Empty; 

} 
+0

ターゲットの属性の名前がわかっている場合(または、 '' * [@ * = '"' ...)を使用して_any_属性をターゲットにしている場合も有効です。しかしながら、名前に無関係にnodeIdの値を持つノードを効果的に選択する必要がある場合、C#(OPのforeachループに似ています)またはLINQの中で、この述語をXPathの_outside_で表現する必要があります(ディーン・チョークの答えに類似)。つまり、XPathは_Node_ [兄弟内の]の位置に基づいて述語を提供しますが、属性の位置を指定する方法はないと私は考えています。 – mjv

0

私は再帰が(ネストされた子ノードを反復処理するための)安全な賭けだと思いますけれども、私が集まる何から、構造は同じまま。そしてそれを念頭に置いて、代わりに[XmlDocumentObj].SelectSingleNode("/[nodeId='"+nodeId+"']")(またはいくつかのファクシミリ)を使用してみませんか?これは、XML構造が常に変更され、定数タグを持たない限り、属性名で検索することができます(この場合、XPathはおそらく良い考えです)。

1

イムこれはexaclty右(私はそれをしようとするXML文書を持っていけないようですが、似た何かが動作するはず

var innerTexts = XDocument.Load(fileName) 
    .Elements(path) 
    .Where(n => n.Attributes().ElementAt(0).Value == nodeId) 
    .SelectMany(n => n.Elements()) 
    .Where(n => n.Name == "GUIDisplay") 
    .SelectMany(n => n.Elements()) 
    .Where(n => n.Name == "sqlSearchString") 
    .Select(n => n.ToString()); 
関連する問題