2

i try to read from an XML file. the XML file is created whith the c# XmlSerializer.

the xml file Looks like

<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>

to read the xml file i use the following code

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),
   };
  }
}

my Problem is, that i do not know how to select the right child node. i hope that someone can help me please. thanks

1
  • And what is your question? What is not working? What are you going to achive? Take a look on a technique called xpath. That can help you a lot. Commented Mar 13, 2017 at 13:36

4 Answers 4

2

Here's how to do it with your approach:

        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)
                };
        }
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for your quick response
1

Here's an example how to access nodes using xpath

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

To learn more about XPath, check this tutorial

1 Comment

Thank you for your quick response
1

you can use XPath here

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>
";

Comments

0

I suggest to use LINQ for reading XML:

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()
};

Output:

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

if you didn't provide whole xml, but only part of it and actually you have many commands, then parsing will look like

var commands =
      from cmd in xdoc.Descendands("command")
      select 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()
      }

1 Comment

Thank you for your quick response

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.