2016-12-19 3 views
0

私はC#で作業していて、<lib>の各IDを見つける最も簡単な方法は?、私は本当にC#自体と特にXMLに新しいので、私はいくつかの助けに感謝したいと思います。C#XML foreach要素ですか?

C#

var xmlData = client.DownloadString(figureMapUrl); 
var doc = XDocument.Parse(xmlData); 

XML:

<map> 
    <lib id="myid1" revision="1"> 
     <part id="2732" type="ch"/> 
     <part id="2732" type="ls"/> 
     <part id="2732" type="rs"/> 
     <part id="2733" type="ch"/> 
    </lib> 
    <lib id="myid2" revision="2"> 
     <part id="2732" type="ch"/> 
     <part id="2732" type="ls"/> 
     <part id="2732" type="rs"/> 
     <part id="2733" type="ch"/> 
    </lib> 
</map> 
+0

をやろうとしている。 – vipersassassin

+0

私はオブジェクトにデシリアライズについてのコメントに同意するでしょう。 また、この例では、「id」属性を持つ2つの異なるエンティティを指定しています。あなたは後に何をしているすべての "ID"の値を持つ単一の大きな配列ですか? –

+0

はい、それは私が –

答えて

0

てみたXML LINQ

LINQを使用して
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("lib").Select(x => new 
      { 
       id = (string)x.Attribute("id"), 
       revision = (int)x.Attribute("revision"), 
       parts = x.Elements("part").Select(y => new 
       { 
        id = (int)y.Attribute("id"), 
        type = (string)y.Attribute("type") 
       }).ToList() 
      }).ToList(); 

      foreach (string id in results.Select(x => x.id).ToArray()) 
      { 
      } 

      foreach (var part in results.Select(x => x.parts)) 
      { 
       foreach (int id in part.Select(y => y.id).ToArray()) 
       { 
       } 
      } 
     } 
    } 
} 
+0

ここに「id」の文字列をforeachできる方法はありますか? –

+0

はい。私は例を示すコードを更新しました。 – jdweng

0

あなたはLINQ to XMLを探しています。今libIdspartIdsIEnumerable<string>ある

// getting first level ids using LINQ to XML 
var libIds = from lib in doc.Descendants("lib") 
select new { id = lib.Attribute("id").Value }; 

// getting second level ids using LINQ to XML 
var partIds = from lib in doc.Descendants("lib") 
from part in lib.Descendants("part") 
select new { value = part .Attribute("id").Value }; 

:私はこのコードを自分でしようとしませんでしたが、私の心の上からそれはようなものになるだろう。 .ToList()を使ってリストにすることができます。

foreach(var id in partIds) Console.WriteLine(id); 
+0

ここに「id」の文字列をforeachできる方法はありますか? –

+0

@VoiDHD、確かに答えを更新しました –

0

もう少しXMLベースのアプローチは、次のようになります。

EDITは

これはidを繰り返す方法です。 ここにPOCOは必要ありません。

XmlDocument xml = new XmlDocument(); 
xml.loadXML(strXMLString); 
foreach(XmlElement ndLib in xml.selectNodes("//lib")) { 
    string strID = ndLib.getAttribute("id"); 
    string strRevision = ndLib.getAttribute("revision"); 
} 
+0

ここに「id」という文字列をforeachできますか? –

+0

foreach(xml.selectNodes( "// lib/@ id")内のXmlNode ndID)... ... –

0

XMLには、次の操作を行うことができます:

var xmlData = client.DownloadString(figureMapUrl); 
var doc = XDocument.Parse(xmlData); 

var idList = doc.Descendants("lib").Select(el => el.Attribute("id").Value).Union(
      doc.Descendants("part").Select(el => el.Attribute("id").Value)) 
      .ToList(); 

エクストラ:あなたが繰り返しを避けたい場合:

var idList = doc.Descendants("lib").Select(getId).Union(
      doc.Descendants("part").Select(getId)) 
      .ToList(); 

string getId(XElement el) => el.Attribute("id").Value; 

これをループすると、定期的なfor-loopを実行できます。

foreach(var id in idList) 
{ 
    // Do something with ID here 
} 

または代わりに、あなたはForEachを使用することができますし、完全に変数を排除:あなたがクラスにデシリアライズすることもできますが、これは何に基づいてされるだろうより管理的にこれを解析するには

doc.Descendants("lib").Select(getId).Union(
doc.Descendants("part").Select(getId)) 
    .ToList() 
    .ForEach(id => { 
     // Do something with id here 
    }); 
+0

ここに「id」の文字列をforeachできる方法はありますか? –

+0

うん、 'foreach'ループか'。ForEach'拡張メソッド(更新された回答を参照) – Kenneth