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は常に空です。

どうすればこれを機能させることができますか?

どうもありがとう

トビ

編集:

今、私は次のコードを手に入れました:

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

ボタンでもテストしましたが、同じ結果になりました

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 に答える