2016-05-16 12 views
0

はループとC#でXMLを解析

<String> 
 
\t \t <Object> 
 
\t \t \t <Name>Whatever</Name> 
 
\t \t </Object> 
 
</String> 
 

 
<Array> 
 
     <Name>Max</Name> 
 
     <Dimsize>8</Dimsize> 
 
     <Cluster> 
 
      <Name>Maximums</Name> 
 
      <NumElts>3</NumElts> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
     </Cluster> 
 
     <Cluster> 
 
      <Name>Maximums</Name> 
 
      <NumElts>3</NumElts> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
     </Cluster> 
 
     <Cluster> 
 
      <Name>Maximums</Name> 
 
      <NumElts>3</NumElts> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
      <U16> 
 
       <Name>Max</Name> 
 
       <Val>0</Val> 
 
      </U16> 
 
     </Cluster> 
 
    </Array>

こんにちは、

Iは、上記のXML文字列があると私は、配列[アイテム]にそのデータを解析したいです。

ご覧のとおり、3つのクラスタノードがあります。 XMLテキストを繰り返し処理して、コンテンツをクラスター内の配列item [0]、item [1]およびitem [2]内に格納します。

これまでのコードはありますが、最初のノードからのみデータが出力されます。残りのノードからすべてのデータを取得するにはどうすればよいですか?

 var xmlStr = File.ReadAllText("myxml.xml"); 
     var str = XElement.Parse(xmlStr); 

      for (int i = 0; i < 3; i++) 
     { 
      var txt = str.XPathSelectElement("Array/Cluster"); 
      var values = txt.Value; 
      Console.WriteLine(values); 
      myChannelArray[i] = values; 
     } 
+3

可能な重複します(http:/を/stackoverflow.com/questions/55828/how-does-one-parse-xml-files) – Nasreddine

+1

あなたが今までに実現するよりも速くXMLを解析できるライブラリがたくさんあります。私はあなたが車輪を再発明する代わりに1つを使用することをお勧めします。 –

答えて

0

System.Xml namespaceはxmlを解析するメソッドを提供します。
例:

var xDoc = new System.Xml.XmlDocument(); 
xDoc.Load("myxml.xml"); 
var xList = xDoc.SelectNodes("//Array/Cluster");//XmlNodeList 
foreach(XmlNode xNode in xList) 
{ 
    var xName = xNode.SelectSingleNode("Name");//XmlNode 
    string name = xNode.InnerText; 
    // and so on 
} 
1

代わりに、手動で各項目を解析し、あなたはおそらく最も簡単であるオブジェクトへのXmlElementデシリアライズを使用することができます。あなたのXMLモデルを模倣するオブジェクトモデルをセットアップするだけです。

あなたは、次のようなものを使用することができます

var original = XElement.Parse(xml); 

//Find the target node where your Array is 
var arrayElement = original.Element("Array").ToString(); 
Data data; 
using (XmlReader reader = XmlReader.Create(new StringReader(arrayElement))) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(Data)); 
    data = serializer.Deserialize(reader) as Data; 
} 

あなたのモデルは、以下のようなものにすることができます[?どの1は、XMLファイルを解析しない]の

[XmlRoot("Array")] 
public class Data 
{ 
    public string Name { get; set; } 
    public string DimSize { get; set; } 

    [XmlElement("Cluster")] 
    public List<Cluster> Cluster { get; set; } 
} 

public class Cluster 
{ 
    public string Name { get; set; } 
    public int NumElts { get; set; } 

    [XmlElement("U16")] 
    public List<U16> U16 { get; set; } 
} 

public class U16 
{ 
    public string Name { get; set; } 
    public string Val { get; set; } 
}