2017-03-13 11 views
0

私はXMLファイルからの読み込みを試みます。 XMLファイルはc#XmlSerializerによって作成されます。C#XMLファイルを読み込んでノードを選択

xmlファイルは、私は次のコード

string filename = "01.xml"; 
XmlDocument xdc = new xmlDocument(); 
xdc.Load(filename); 
XmlNodeList xnlNodes = xelRoot.SelectNodes("command"); 

foreach(XMLNode nxmNode in xnlNodes) 
{ 
    XmlElement element = (XmlElement)xndNode; 

    string Name = Convert.ToString(xndNode{"Name"].InnerText); 

    data = new int[] 
    { 
    Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText), 
    Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText), 
    Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText), 
    }; 

    rangeData = new int[] 
    { 
    Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText), 
    Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText), 
    Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText), 
    }; 
    } 
} 

を使用してXMLファイルを読むために

<command> 
    <Name>one</Name> 
    <data> 
    <int>46</int> 
    <int>49</int> 
    <int>50</int> 
    </data> 
    <rangeData> 
    <int>36</int> 
    <int>29</int> 
    <int>10</int> 
    </rangeData> 
</command> 

のように見える私の問題は、私は右の子ノードを選択する方法がわからないこと、です。誰かが私を助けてくれることを願っています。おかげ

+0

そして、何あなたがあります質問?何が効いていないのですか?あなたは何をするつもりですか? xpathと呼ばれる手法を見てみましょう。それはあなたに多くを助けることができます。 – Sammy

答えて

1

をXPathを使用することができますここではあなたのアプローチでそれを行う方法は次のとおりです。

 string filename = "01.xml"; 
     XmlDocument xdc = new XmlDocument(); 
     xdc.Load(filename); 
     XmlNodeList xnlNodes = xdc.SelectNodes("command"); 

     foreach (XmlNode xnlNode in xnlNodes) 
     { 
      XmlElement element = (XmlElement)xnlNode; 

      string Name = Convert.ToString(xnlNode["Name"].InnerText); 
      int[] data = new int[] 
       { 
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[0].InnerText), 
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[1].InnerText), 
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[2].InnerText) 
       }; 

      int[] rangeData = new int[] 
       { 
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[0].InnerText), 
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[1].InnerText), 
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[2].InnerText) 
       }; 
     } 
+0

ありがとうございました – Homer

0

私はXMLを読み取るためのLINQを使用することをお勧め:

var xdoc = XDocument.Load(filename); 
var cmd = xdoc.Root; 
var command = new { 
    Name = (string)cmd.Element("Name"), 
    Data = cmd.Element("data").Elements().Select(e => (int)e).ToList(), 
    RangeData = cmd.Element("rangeData").Elements().Select(e => (int)e).ToList() 
}; 

は出力:

{ 
    Name: "one", 
    Data: [ 46, 49, 50 ], 
    RangeData: [ 36, 29, 10 ] 
} 

あなたが全体のxmlが、それの一部だけを提供していませんでしたし、実際には多くのコマンドを使用している場合、構文解析は次のようになります

+0

ご連絡ありがとうございました – Homer

0

ここでは、xpathを使用してノードにアクセスする方法を示します

XmlDocument xdc = new XmlDocument(); 
    xdc.Load(filename); 
    var nodes = xdc.SelectNodes("command/data/int"); 
    foreach (XmlNode node in nodes) 
    { 
     string s = node.InnerText; 
    } 

のXPathの詳細については、this tutorial

+0

ご連絡ありがとうございました – Homer

0

をチェックしますが、ここで

void Main() 
{ 
    var doc = new XmlDocument(); 
    doc.LoadXml(xml); 

    var name = doc.DocumentElement 
     .SelectSingleNode("/command/Name") 
     .InnerText; 

    var data = doc.DocumentElement 
     .SelectNodes("/command/data/int") 
     .OfType<XmlNode>() 
     .Select(x=> Int32.Parse(x.InnerText)) 
     .ToArray(); 

    var rangeData = doc.DocumentElement 
     .SelectNodes("/command/rangeData/int") 
     .OfType<XmlNode>() 
     .Select(x => Int32.Parse(x.InnerText)) 
     .ToArray(); 
} 


string xml = @" 
<command> 
    <Name>one</Name> 
    <data> 
    <int>46</int> 
    <int>49</int> 
    <int>50</int> 
    </data> 
    <rangeData> 
    <int>36</int> 
    <int>29</int> 
    <int>10</int> 
    </rangeData> 
</command> 
"; 
関連する問題