【问题标题】:c# XML read: read of nodes with same node namec# XML读取:读取具有相同节点名称的节点
【发布时间】:2017-04-13 18:48:28
【问题描述】:

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

是否可以选择将每个“字符串”的InnerText 保存到数组中? 我也尝试了下面的代码(for循环),但不知道如何定义循环数(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>

【问题讨论】:

    标签: c# arrays xml


    【解决方案1】:

    在一条指令中使用 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();
    
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      循环次数可以从下面找到

      TBElement.GetElementsByTagName("Languages/string").Count()
      

      只需将它存储在一个变量中并在循环条件中使用它

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

      【讨论】:

        【解决方案3】:

        试试这个:

        var stringElements = TBElement.GetElementsByTagName("Languages/string");
        List<string> languages = new List<string>();
        
        foreach (var element in stringElements)
            languages.Add(element.InnerText);
        

        如果你更喜欢数组:

        var stringElements = TBElement.GetElementsByTagName("Languages/string");
        string[] languages = new string[stringElements.Count];
        
        for (int i = 0; i != stringElements.Count; ++i)
            languages[i] = stringElements[i].InnerText;
        

        【讨论】:

          【解决方案4】:

          你可以这样:

          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
          }
          

          【讨论】:

            【解决方案5】:

            您的问题的直接答案是这样做:

            xmlNodeList.Cast<XmlNode>().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]);
                        }
                    }
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2016-05-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多