2

これは簡単な質問だと確信していますが、理解できません。

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

<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 で遊んでいますが、これを機能させる方法がわかりません。

私は半分正規表現でそれをやりたいと思っていますが、それは非常に汚いと感じています.

4

4 に答える 4

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、ドキュメント全体のすべてのノードを考慮しているため、比較的単純です。

于 2012-04-13T15:18:36.283 に答える
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);
于 2012-04-13T15:27:35.690 に答える
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);
于 2012-04-13T15:31:24.097 に答える
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; 
   }
} 

動作する必要がありますか?

于 2012-04-13T15:19:41.923 に答える