2012-04-13 6 views
2

これは簡単な質問ですが、わかりません。'name'を検索して 'value'要素を取得します。

私はC#で文字列にXMLファイルをダウンロードしていて、それが次の形式での項目が含まれています

<attribute name="Make" value="Volvo" /> 
<attribute name="Color" value="Blue" /> 
<attribute name="Damage" value="Rear scratched" /> 
<attribute name="Damage" value="Left hand side dented" /> 

そして、私がやりたいすべてがダメージ」の値のすべてを取得しています"(どこに落ちても)文書全体で、配列に格納されます。私はXmlDocument/XmlNodeListで遊んできましたが、私はこの動作をどうやって得るのか分かりません。

私はRegExでそれをするのがやっと誘惑されますが、それは非常に汚いと感じます。

+0

Linq to XML =速く読みやすいコードを使用してください。 http://msdn.microsoft.com/en-us/library/bb387098.aspx – Sogger

+0

タイトルに「XML/C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

7

使用XDocument

var doc = XDocument.Parse(xml); 
var result = doc.Descendants("attribute") 
       .Where(x => x.Attribute("name") != null && 
          x.Attribute("value") != null) 
       .Where(x => x.Attribute("name").Value == "Damage") 
       .Select(x => x.Attribute("value").Value) 
       .ToArray(); 

は注意してください:それは考慮に入れ、全体ドキュメント内のすべてのノードattributeがかかるので
このコードは、比較的簡単です。

+1

警告:質問内の属性のリストは、このコードでは「現状のまま」機能しません。 「ルート要素」はありません。 「属性」要素に親の「属性」要素がある場合、このコードサンプルは完全に機能します。 –

+0

@GlennFerrieLive:このコードでは問題はありませんが、提供されたサンプルデータは有効なXMLではないため、OPで関連する部分のみが表示されていると想定しています。 –

+0

私はあなたに同意します。 –

1
string val = ""; 
XmlDocument doc = new XmlDocument(); 

doc.Load("file.xml"); 

XmlNodeList nodes = doc.SelectNodes("/attribute[@name='Damage']"); 

foreach (XmlNode node in nodes) 
{ 
    { 
     val = node.Attributes["value"].Value; 
    } 
} 

は有効ですか?

+1

申し訳ありませんが、コードは既に編集されています –

+0

@DanielHilgarthコードは私の元のコメントから編集されました。これは編集修正に応じて削除されます。 – Sogger

1

LINQ-TO-XMLを活用することはできますが、リジッドXMLを提供する必要があります。手動でルートノードを作成すると、System.Xml.XmlException : There are multiple root elements.になります。

// raw - your XML 
string raw = File.ReadAllText("c:\\test1.xml"); 

// create root node manually 
string xml = "<root>" + raw + "</root>"; 
var xdoc = XDocument.Parse(xml);  

// contains IEnumerable<string> 
// TODO: add null-checks 
var damagedValues = xdoc.Descendants("attribute") 
         .Where(e => e.Attribute("name").Value == "Damage") 
         .Select(e => e.Attribute("value").Value); 
1

これはXMLドキュメントではありません。断片です。それをルート要素で囲む必要があります。これはうまくいくでしょう:

string fragment = File.ReadAllText("file.xml"); 
var doc = XDocument.Parse("<root>" + fragment + "</root>"); 

var values = from element in doc.XPathSelectElements(@"//attribute[@name='Damage']") 
      select element.Attribute("value").Value; 

values.ToList().ForEach(Console.WriteLine); 
関連する問題