c#XML读取:读取具有相同节点名的节点

c#XML读取:读取具有相同节点名的节点,c#,arrays,xml,C#,Arrays,Xml,我在下面的XML中有更多的“字符串”节点(字符串节点的数量由一个工具定义-添加了多少种语言) 我使用system.xml将每个节点保存到一个字符串中,如下代码所示: 是否有选项将每个“字符串”的InnerText保存到数组中? 我还尝试了下面的代码(用于循环),但不知道如何定义循环数(stringnumber)。 如有任何建议,将不胜感激 valid = TBElement.GetElementsByTagName("Valid")[0].InnerText; for (int b = 0;

我在下面的XML中有更多的“字符串”节点(字符串节点的数量由一个工具定义-添加了多少种语言) 我使用
system.xml
将每个节点保存到一个字符串中,如下代码所示:

是否有选项将每个“字符串”的
InnerText
保存到数组中? 我还尝试了下面的代码(用于循环),但不知道如何定义循环数(stringnumber)。 如有任何建议,将不胜感激

valid = TBElement.GetElementsByTagName("Valid")[0].InnerText;

for (int b = 0; b == stringnumber; b++)
{
    languages[b] = TBElement.GetElementsByTagName("Languages/string")[0].InnerText;
}
以下是XML:

<ArrayOfGlobalInfo>
 <GlobalInfo>
  <NumberOfEntries>2</NumberOfEntries>
  <LanguageNewDefaultOptions />
  <Languages>
    <string>eng</string>
    <string>ger</string>
    <string>ita</string>
    <string>fre</string>
  </Languages>
  <Valid>true</Valid>
 </GlobalInfo>
</ArrayOfGlobalInfo>

2.
英格
蒙古包
伊塔
弗雷
真的

循环的数量可以从下面找到

TBElement.GetElementsByTagName("Languages/string").Count()
只需将其存储在变量中并在循环条件中使用即可

 var stringnumber = TBElement.GetElementsByTagName("Languages/string").Count()

你可以这样做:

XDocument xdoc = XDocument.Load("YourXMLFile");
XmlNodeList elemList = xdoc.GetElementsByTagName("string");
        for (int i = 0; i < elemList.Count; i++)
        {
            Console.WriteLine(elemList[i].InnerText);
        }
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("Your file path");
XmlNodeList dataNodes = xmlDoc.SelectNodes("/ArrayOfGlobalInfo/GlobalInfo/Languages/string");

foreach (XmlNode node in dataNodes)
                {
//Your code goes here
}
试试这个:

var stringElements = TBElement.GetElementsByTagName("Languages/string");
List<string> languages = new List<string>();

foreach (var element in stringElements)
    languages.Add(element.InnerText);

在一条指令中使用XML Linq实现

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


namespace ConsoleApplication49
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            string[] languages = doc.Descendants("string").Select(x => (string)x).ToArray();

        }

    }
}

对您的问题的直接回答是:

xmlNodeList.Cast<XmlNode>().Select(n => n.InnerText).ToArray();
xmlNodeList.Cast().Select(n=>n.InnerText.ToArray();
…其中xmlNodeList是在GetElementsByTagName()中成功计算XPath表达式的结果

但你可以考虑:

  • 使用XDocument而不是XmlDocument是否更好
  • 是否确实需要数组,因为XmlNodeList已经具有.Count属性
这说明了您的一些选择:

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

namespace _43387906
{
    class Program
    {
        private static string _xml = "<ArrayOfGlobalInfo>\r\n <GlobalInfo>\r\n  <NumberOfEntries>2</NumberOfEntries>\r\n  <LanguageNewDefaultOptions />\r\n  <Languages>\r\n    <string>eng</string>\r\n    <string>ger</string>\r\n    <string>ita</string>\r\n    <string>fre</string>\r\n  </Languages>\r\n  <Valid>true</Valid>\r\n </GlobalInfo>\r\n</ArrayOfGlobalInfo>";

        static void Main(string[] args)
        {
            try
            {
                var xDocument = XDocument.Parse(_xml);
                UseXDocumentVerbose(xDocument);
                UseXDocumentShorter(xDocument);

                var xmlDocument = new XmlDocument();
                xmlDocument.LoadXml(_xml);

                UseXmlDocument(xmlDocument);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            Console.ReadLine();
        }

        private static void UseXmlDocument(XmlDocument xmlDocument)
        {
            var languages = xmlDocument.SelectNodes("ArrayOfGlobalInfo/GlobalInfo/Languages/string");

            //You can use languages.Count without converting to an array
            for (int i = 0; i < languages.Count; i++)
            {
                Console.WriteLine(languages[i].InnerText);
            }

            //The trick is to use Cast<T>() and ToArray()
            var languagesArray = languages.Cast<XmlNode>().Select(n => n.InnerText).ToArray();

            for (int i = 0; i < languagesArray.Length; i++)
            {
                Console.WriteLine(languagesArray[i]);
            }
        }

        private static void UseXDocumentShorter(XDocument xDocument)
        {
            if (xDocument.Root.Name != "ArrayOfGlobalInfo")
                throw new Exception("Root isn't ArrayOfGlobalInfo");

            var languages = xDocument.Root
                                     .Elements("GlobalInfo")
                                     .SelectMany(i => i.Elements("Languages"))
                                     .SelectMany(l => l.Elements("string"))
                                     .Select(s => s.Value).Where(s => !string.IsNullOrWhiteSpace(s))
                                     .ToArray();

            for (int i = 0; i < languages.Length; i++)
            {
                Console.WriteLine(languages[i]);
            }
        }

        private static void UseXDocumentVerbose(XDocument xDocument)
        {
            if (xDocument.Root.Name != "ArrayOfGlobalInfo")
                throw new Exception("Root isn't ArrayOfGlobalInfo");

            var globalInfoElements = xDocument.Root.Elements("GlobalInfo");

            var languageElements = globalInfoElements.SelectMany(i => i.Elements("Languages"));

            var languages = languageElements.SelectMany(l => l.Elements("string")).Select(s => s.Value).Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();

            for (int i = 0; i < languages.Length; i++)
            {
                Console.WriteLine(languages[i]);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Xml;
使用System.Xml.Linq;
名称空间_43387906
{
班级计划
{
私有静态字符串\u xml=“\r\n\r\n 2\r\n\r\n\r\n eng\r\n ger\r\n ita\r\n fre\r\n\r\n true\r\n\r\n”;
静态void Main(字符串[]参数)
{
尝试
{
var xDocument=xDocument.Parse(_xml);
使用xdocumentverbose(xDocument);
使用xdocumentshorter(xDocument);
var xmlDocument=新的xmlDocument();
LoadXml(xml);
使用xmlDocument(xmlDocument);
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
Console.ReadLine();
}
私有静态void UseXmlDocument(XmlDocument XmlDocument)
{
var languages=xmlDocument.SelectNodes(“ArrayOfGlobalInfo/GlobalInfo/languages/string”);
//您可以使用语言。计数而不转换为数组
for(int i=0;in.InnerText.ToArray();
for(int i=0;ii.Elements(“语言”))
.SelectMany(l=>l.Elements(“字符串”))
.Select(s=>s.Value)。其中(s=>!string.IsNullOrWhiteSpace)
.ToArray();
for(int i=0;ii.Elements(“语言”);
var languages=languageElements.SelectMany(l=>l.Elements(“字符串”)).Select(s=>s.Value)。其中(s=>!string.IsNullOrWhiteSpace(s)).ToArray();
for(int i=0;i
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace _43387906
{
    class Program
    {
        private static string _xml = "<ArrayOfGlobalInfo>\r\n <GlobalInfo>\r\n  <NumberOfEntries>2</NumberOfEntries>\r\n  <LanguageNewDefaultOptions />\r\n  <Languages>\r\n    <string>eng</string>\r\n    <string>ger</string>\r\n    <string>ita</string>\r\n    <string>fre</string>\r\n  </Languages>\r\n  <Valid>true</Valid>\r\n </GlobalInfo>\r\n</ArrayOfGlobalInfo>";

        static void Main(string[] args)
        {
            try
            {
                var xDocument = XDocument.Parse(_xml);
                UseXDocumentVerbose(xDocument);
                UseXDocumentShorter(xDocument);

                var xmlDocument = new XmlDocument();
                xmlDocument.LoadXml(_xml);

                UseXmlDocument(xmlDocument);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            Console.ReadLine();
        }

        private static void UseXmlDocument(XmlDocument xmlDocument)
        {
            var languages = xmlDocument.SelectNodes("ArrayOfGlobalInfo/GlobalInfo/Languages/string");

            //You can use languages.Count without converting to an array
            for (int i = 0; i < languages.Count; i++)
            {
                Console.WriteLine(languages[i].InnerText);
            }

            //The trick is to use Cast<T>() and ToArray()
            var languagesArray = languages.Cast<XmlNode>().Select(n => n.InnerText).ToArray();

            for (int i = 0; i < languagesArray.Length; i++)
            {
                Console.WriteLine(languagesArray[i]);
            }
        }

        private static void UseXDocumentShorter(XDocument xDocument)
        {
            if (xDocument.Root.Name != "ArrayOfGlobalInfo")
                throw new Exception("Root isn't ArrayOfGlobalInfo");

            var languages = xDocument.Root
                                     .Elements("GlobalInfo")
                                     .SelectMany(i => i.Elements("Languages"))
                                     .SelectMany(l => l.Elements("string"))
                                     .Select(s => s.Value).Where(s => !string.IsNullOrWhiteSpace(s))
                                     .ToArray();

            for (int i = 0; i < languages.Length; i++)
            {
                Console.WriteLine(languages[i]);
            }
        }

        private static void UseXDocumentVerbose(XDocument xDocument)
        {
            if (xDocument.Root.Name != "ArrayOfGlobalInfo")
                throw new Exception("Root isn't ArrayOfGlobalInfo");

            var globalInfoElements = xDocument.Root.Elements("GlobalInfo");

            var languageElements = globalInfoElements.SelectMany(i => i.Elements("Languages"));

            var languages = languageElements.SelectMany(l => l.Elements("string")).Select(s => s.Value).Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();

            for (int i = 0; i < languages.Length; i++)
            {
                Console.WriteLine(languages[i]);
            }
        }
    }
}