使用XMLReader将XMLData保存到List

时间:2012-07-03 07:49:22

标签: c# xml list xmlreader

我在C#中遇到了XMLReader的问题。

我得到了这个代码:

private void countryXMLReader ()
        {
            XmlTextReader reader = new XmlTextReader("expenses.xml");
            List<string> twentyFour = new List<string>();
            while (reader.Read())
            {

                if (reader.Name.Equals("_24h"))
                {
                    twentyFour.Add(reader.Value);
                }

                if (reader.Name == "_14h")
                {
                    //MessageBox.Show(reader.Name);
                }


            }
        }

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<expenses>
    <country>
        <name>Germany</name>
        <ID>D</ID>
        <_24h>42</_24h>
        <_14h>28</_14h>
        <_8h>14</_8h>
        <overnight>100</overnight>
    </country>
    <country>
        <name>India</name>
        <ID>IND</ID>
            <_24h>30</_24h>
            <_14h>20</_14h>
            <_8h>10</_8h>
            <overnight>120</overnight>
    </country>
</expenses>

ListItems被添加到列表中,但reader.Value总是空的。

我怎样才能让它发挥作用?

非常感谢

托比

编辑:

现在我得到了以下代码:

private void countryXMLReader()         {             列出twentyFour = new List();

        XDocument doc = XDocument.Load(@"C:\Users\Bl!tz\Documents\Visual Studio 2010\Projects\MBG.SimpleWizard\Demo\bin\Debug\expenses.xml");
        twentyFour.AddRange(doc
                          .Elements("expenses")
                          .Descendants("country")
                          .Descendants("_24h")
                          .Select(i => i.Value)
                          .ToList());
    }

但它并没有真正获得价值。

可能是我的问题?

EDIT2:

这是我使用的代码:

private void countryXMLReader ()
        {
            List<string> twentyFour = new List<string>();

            XDocument doc = XDocument.Load(@"expenses.xml");
            twentyFour.AddRange(doc
                              .Elements("expenses")
                              .Descendants("country")
                              .Descendants("name")
                              .Descendants("ID")
                              .Descendants("_24h")
                              .Descendants("_14h")
                              .Descendants("_8h")
                              .Descendants("overnight")
                              .Select(i => i.Value)
                              .ToList());
        }

但List.Count保持为0.我将此方法称为:

public Page1()
        {
            InitializeComponent();
            countryXMLReader();
        }

我也用按钮测试了它,但结果相同

2 个答案:

答案 0 :(得分:0)

尝试使用XmlDocument和XPath表达式的代码:

        string s = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><expenses>    <country>        <name>Germany</name>        <ID>D</ID>        <_24h>42</_24h>        <_14h>28</_14h>        <_8h>14</_8h>        <overnight>100</overnight>    </country>    <country>        <name>India</name>        <ID>IND</ID>            <_24h>30</_24h>            <_14h>20</_14h>            <_8h>10</_8h>            <overnight>120</overnight></country></expenses>";

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

        XmlNode rootNode = doc.SelectSingleNode(@"/expenses");
        var nodes24 = rootNode.SelectNodes(@"country/_24h");
        var nodes14 = rootNode.SelectNodes(@"country/_14h");

        List<string> twentyFour = new List<string>();
        twentyFour.AddRange(nodes24
                            .Cast<XmlNode>()
                            .Select(i => i.InnerText)
                            .ToArray());

您也可以尝试使用System.Xml.Linq方法,该方法比XmlDocument更新,但要求NET版本高于3.0:

        List<string> names = new List<string>();
        List<string> twentyFour = new List<string>();
        List<string> fourteen = new List<string>();

        XDocument doc = XDocument.Load(@"expenses.xml");

        var elements = doc
          .Root
          .Descendants("country");

        names.AddRange(elements
                            .Descendants("name")
                            .Select(i => i.Value)
                            .ToList());

        twentyFour.AddRange(elements
                            .Descendants("_24h")
                            .Select(i => i.Value)
                            .ToList());

        fourteen.AddRange(elements
                            .Descendants("_14h")
                            .Select(i => i.Value)
                            .ToList());

        // You can process each country element individually like this
        foreach (XElement el in elements)
        {
            string name = el.Element("name").Value;
            string _24h = el.Element("_24h").Value;
            string _14h = el.Element("_14h").Value;
        }

答案 1 :(得分:0)

要在XmlReader中使用ReadElementContentAsString()提供元素内容的字符串值。

而不是

twentyFour.Add(reader.Value);

使用

twentyFour.Add(reader.ReadElementContentAsString());