1

I have an XML file with a structure similar to this

<entry name="something">
  <members>
    <member>aaa</member>
    <member>bbb</member>
  </members>
</entry>
<entry name="something_else">
  <members>
    <member>ccc</member>
    <member>ddd</member>
  </members>
</entry>

I need to be able to get the values out of each of the member nodes to store in a datatable. if i use the innertext property, it concatenates the values (aaabbb). there is nothing discernible to split the string on. I can also use the inner XML but then i just get a string with the XML structure (aaa bbb<\member>)

What is the best way to get each value out of the XML elements and store it in a string array?

here is what I have been trying.

foreach (XmlNode grpNode in GrpList)
{
    subNode = grpNode.Attributes["name"];
    if (subNode != null)
    {
        Obj = grpNode.Attributes["name"].Value;
    }

    subNode = grpNode["members"];
    if (subNode != null)
    {
        string innerXml = string.Empty;
        innerXml = grpNode["members"].InnerXml.ToString();

        string[] tempArrary = innerXml.Split(new char[] {'>', '<'});
    }
}
Charles Mager
  • 25,735
  • 2
  • 35
  • 45
user5019819
  • 63
  • 1
  • 1
  • 11

5 Answers5

1

You can use Xpath to iterate through Entry nodes and get the members within it like this

string xml = "<root><entry name='something'>" +
              "<members>" + 
                "<member>aaa</member>" + 
                "<member>bbb</member>" + 
              "</members>" + 
            "</entry>" + 
            "<entry name='something_else'>" + 
              "<members>" + 
                "<member>ccc</member>" + 
                "<member>ddd</member>" + 
             "</members>" +
            "</entry></root>";

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            var memsList = doc.SelectNodes("//entry");
            foreach (XmlNode a in memsList)
            {
                Console.WriteLine(a.Attributes["name"].Value);

                var memList = a.SelectNodes("members/member");

                foreach(XmlNode x in memList)
                    Console.WriteLine(x.InnerText);
            }
XtremeBytes
  • 1,469
  • 8
  • 12
0

You need to iterate the child elements within members, so something like:

foreach (var node in grpNode["members"].ChildNodes)
{
    var value = node.InnerText;
}

That said, you would be better off using LINQ to XML unless you have some specific reason to use XmlDocument. This gives you much more expressive code, for example:

var doc = XDocument.Parse(xml);

var something = doc.Descendants("entry")
    .Where(e => (string)e.Attribute("name") == "something")
    .Single();

var somethingMembers = something.Descendants("member")
    .Select(e => e.Value)
    .ToArray();
Charles Mager
  • 25,735
  • 2
  • 35
  • 45
0

This should do the trick:

XDocument xdoc = XDocument.Load(@"Path/to/file");
var result = xdoc.Descendants("member").Select (x => x.Value).ToArray();

Result:

enter image description here

Demo Code

Marco
  • 22,856
  • 9
  • 75
  • 124
0

the xml you've provided isn't valid. But assuming you just want the inner text of all member nodes into a string array, I'd just use Linq-To-Xml (XDocument):

var results = XDocument.Parse(xmlString)
                       .Descendants("member")
                       .Select(m => m.Value)
                       .ToArray();
Jonesopolis
  • 25,034
  • 12
  • 68
  • 112
0

Even though you're using the old XmlDocument API, by throwing in an .OfType<XmlNode>() you can convert an XmlNodeList to a generic enumerable and thereby mix in some linq and lambda syntax, for instance:

var tempArrary = subNode.SelectNodes("member").OfType<XmlNode>().Select(n => n.InnerText).ToArray();
dbc
  • 104,963
  • 20
  • 228
  • 340