2016-04-06 16 views
0

XmlNodeList私はXmlNodeListの中に特別なノードを見つけたいと思っています。 次のコードを使用しましたが、目的のノードが見つからない場合は、XmlNodeListにあります。XmlNodeListの属性を持つ特別なノードを見つけよう

string ID = "9"; 
public void XMlNodeFind(XmlNodeList steps, string ID) 
{ 
    var resultNodes = new List<XmlNode>(); 
    foreach (XmlNode node in steps) 
    { 
     if (node.Attributes["name"].Value.Equals(ID)) 
     { 
      resultNodes.Add(node); 
     } 
    } 
} 

、ここでXMLファイルです:あなたが必要なもの

<?xml version="1.0" encoding="utf-8"?> 
<files> 
    <file name="1"> 
     <file name="3"> 
      <file name="9"> 
      </file> 
     </file> 
    </file> 
    <file name="2"> 
     <text here are some text/> 
    </file> 
</files> 
+0

そして、最初に 'XmlNodeList'をどのように設定しましたか? – har07

+1

'' XmlNodeList steps = root1.SelectNodes( "// files/file"); '' –

+1

また、 'resultNodes'は' XMlNodeFind() 'によって返されないので、どのように結果を確認しましたか? – har07

答えて

0

、私はこのようなものを使用したいですC#6では、もちろん、式を使ったメソッドを使うことができます。)

+0

あなたの答えをありがとう。 '()'を 'docに追加してください。子孫。 –

+0

@SaberJalilzadeh:完了。 –

0

すべてのノードを横断し、一致するノードを見つけるためrecursive機能です。

public List<XmlNode> XMlNodeFind(XmlNodeList steps, string ID) 
{ 
    var resultNodes = new List<XmlNode>(); 
    foreach (XmlNode node in steps) 
    { 
     if (node.Attributes != null && node.Attributes["name"] != null &&node.Attributes["name"].Value.Equals(ID)) 
     { 
      resultNodes.Add(node); 
     } 
     resultNodes.AddRange(XMlNodeFind(node.ChildNodes, ID)); 

    } 
    return resultNodes; 
} 
+0

あなたは '.Value'が必要です – SamGhatak

+0

ああ、申し訳ありません...既に編集済み...(y) – SamGhatak

+0

@SamGhatak感謝しました。 –

0

あなたはこれを試すことができますが、あなたがに許可されている場合、私はXMLにLINQを使用することをお勧めします:EDIT

string ID = "9"; 

public void XMlNodeFind(XmlNodeList steps, string ID) 
{ 
    var resultNodes = new List<XmlNode>(); 
    foreach (XmlNode node in steps) 
    { 
     if (node.Attributes["name"].Value.Equals(ID)) 
     { 
      resultNodes.Add(node); 
     } 
    } 
} 

:1

まずあなたが提供した情報が間違っています。 stepsに特定のノードがありませんが、xmlには存在しています。

あなたはSelectNodes("/files//file");が必要です。

私はそう思っています。うまく動作します。

+0

このコードは私が書いたものと同じですか? –

+0

いいえ、あなたは '.Value.'の部分を見逃しました... – SamGhatak

+0

あなたの質問をいくつかの修正で編集するときは、それを編集としてコメントしてください。私たちは愚か者のように見える。 – SamGhatak

1

まず、//files/filefiles直接の子あるfileの要素を返します。あなたは関係なく、それがfiles内にネストされてどのように深いあなたの代わりに//を使用する必要があり、すべてのfileの要素を取得しないようにしたい場合:

XmlNodeList steps = root1.SelectNodes("/files//file"); 

を現在お使いの関数は常にfalseに評価される文字列に対してXmlAttributeを比較します。だから、他の答えで述べたように、代わりに値を比較しておくべきです。また、全体の機能は、LINQの助けを借りて簡単にすることができます:で

public List<XElement> FindElementsByName(XDocument doc, string name) 
{ 
    return doc.Descendants() 
       .Where(x => (string) x.Attribute("name") == name) 
       .ToList(); 
} 

(:あなたはXMLにLINQを使用することができると述べてきたように

public void XMlNodeFind(XmlNodeList steps, string ID) 
{ 
    var resultNodes = steps.Cast<XmlNode>() 
          .Where(o => o.Attributes["name"].Value.Equals(ID)) 
          .ToList(); 
} 
関連する問題