解析XML子树

时间:2015-10-23 21:16:06

标签: c# xml parsing subtree

我对C#很新,我真的很难解决这个问题。

所以基本上我有一个像这样的XML文件:

<groups>
<group id="1" name="group1" location="null">
    <member id="1" name="Jack" age="32"/>
    <member id="2" name="Tom" age="25"/>
    <member id="3" name="John" age="32"/>
</group>
<group id="2" name="group2" location="null">
        <member id="1" name="Bob" age="31"/>
        <member id="2" name="Michael" age="34"/>
        <member id="3" name="Mike" age="44"/>
</group>

不完全是这样,但它遵循完全相同的格式。所以我想要做的是,将一个小组的所有成员加入其自己的列表。所以每个小组都有它自己的列表。所以Jack,Tom,John(组ID 1的成员)将在list1中,Bob,Michael和Mike(组ID 2的成员)将在list2中。我目前有这个,这基本上把所有成员,无论他们的群体,放在同一个列表中,这不是我想要的。解决方案可能非常简单,我只是没有使用XML文件的经验,所以不知道如何推进这个。

String XMLURL = "link_to_xml";

using (XmlTextReader reader = new XmlTextReader(XMLURL))
{
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                switch (reader.Name)
                {
                    case "member":
                        if (reader.HasAttributes)
                        {
                            reader.MoveToAttribute(1);
                            players.Add(reader.Value.ToUpper());
                        }
                        break;
                }
                break;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可以像这样使用System.Xml.Linq:

    private List<string[]> GetGroups(string xml)
    {
        List<string[]> result = new List<string[]>();
        XDocument document = XDocument.Parse(xml);
        XElement groups = document.Root;
        foreach (XElement group in groups.Elements("group"))
        {
            result.Add(group.Elements("member").Select(item => item.Attribute("name").ToString()).ToArray());
        }
        return result;
    }

我没有用测试文件运行它。我只是想让您了解如何使用System.Xml.Linq命名空间类。

答案 1 :(得分:0)

您可以使用XML Linq轻松完成。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Globalization;


namespace ConsoleApplication53
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
             "<groups>" +
                "<group id=\"1\" name=\"group1\" location=\"null\">" +
                    "<member id=\"1\" name=\"Jack\" age=\"32\"/>" +
                    "<member id=\"2\" name=\"Tom\" age=\"25\"/>" +
                    "<member id=\"3\" name=\"John\" age=\"32\"/>" +
                "</group>" +
                "<group id=\"2\" name=\"group2\" location=\"null\">" +
                        "<member id=\"1\" name=\"Bob\" age=\"31\"/>" +
                        "<member id=\"2\" name=\"Michael\" age=\"34\"/>" +
                        "<member id=\"3\" name=\"Mike\" age=\"44\"/>" +
                "</group>" +
             "</groups>";

            XDocument doc = XDocument.Parse(xml);
            var results = doc.Descendants("group").Select(x => new {
                id = (int)x.Attribute("id"),
                name = x.Attribute("name").Value,
                location = x.Attribute("location").Value,
                memebers = x.Elements("member").Select(y => new {
                    id = (int)y.Attribute("id"),
                    name = y.Attribute("name").Value,
                    age = (int)y.Attribute("age")
                }).ToList()
            }).ToList();
        }

    }
}