0

我在 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 始终为空。

我怎样才能让它工作?

非常感谢

托比

编辑:

现在我得到了以下代码:

私人无效国家XMLReader(){列表二十四=新列表();

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

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

我的问题是什么?

编辑2:

这是我使用的代码:

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

我还用一个按钮对其进行了测试,但结果相同

4

2 回答 2

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 更新,但需要高于 3.0 的 NET 版本:

        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;
        }
于 2012-07-03T08:02:51.790 回答
0

XmlReader用于给出正在使用的元素内容的字符串值ReadElementContentAsString()

代替

twentyFour.Add(reader.Value);

利用

twentyFour.Add(reader.ReadElementContentAsString());
于 2012-07-03T10:13:28.797 回答