使用foreach获取所有子节点值

时间:2016-11-30 12:35:32

标签: c# .net xml

<R>
<tests>
<test language="en"> hello </test>
<test language="it"> ciao </test>
<test language="hu"> szia </test>
<test language="es"> ola </test>
</tests>
</R>

XML的上述部分包含在(XML)文件中。我确实希望foreach test xml元素读取并获取XML值。

我试过这样的事情:

    XDocument xdoc = XDocument.Load(theXmlURLpath);

    foreach (var iDescription in xdoc.XPathSelectElements("R/tests"))
    {
         string lang = iDescription.Attribute("language").Value; // en / it / hu / es
         string text= iDescription.Value; // hello or ciao ...
         switch(iLang)
         {
          case "en":
          // do something
          break;
          case "it":
          // do something
          break;
          case "hu":
          // do something
          break;
          case "es":
          // do something
          break;
         }
 }

3 个答案:

答案 0 :(得分:3)

您的XPath不会选择<test/>元素,而是选择<tests/>父元素。

尝试

xdoc.XPathSelectElements("R/tests/test")

答案 1 :(得分:0)

不要将xml(XmlDocument)直接与xml linq(XDocument)混合。试试这个

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

namespace ConsoleApplication29
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument xdoc = XDocument.Load(FILENAME);

                foreach (var iDescription in xdoc.Descendants("test"))
                {
                     string lang = (string)iDescription.Attribute("language"); // en / it / hu / es
                     string text= (string)iDescription; // hello or ciao ...
                     switch(lang)
                     {
                          case "en":
                          // do something
                          break;
                          case "it":
                          // do something
                          break;
                          case "hu":
                          // do something
                          break;
                          case "es":
                          // do something
                          break;
                     }
                 }

        }

    }

}

答案 2 :(得分:0)

{{1}}