2017-04-13 25 views
0

以下のXMLを文字列ノードに追加しました(文字列ノードの数はツールで定義されています - いくつの言語が追加されますか) 私はsystem.xmlを使用しました各ノードは以下のコードのような文字列になります。c#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> 

答えて

0

ループの数は以下

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

単に変数に格納し、ループ条件

で使用から求めることができます
var stringnumber = TBElement.GetElementsByTagName("Languages/string").Count() 
0

このようにすることができます:

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 
} 
0

これを試してみてください:

XDocument xdoc = XDocument.Load("YourXMLFile"); 
XmlNodeList elemList = xdoc.GetElementsByTagName("string"); 
     for (int i = 0; i < elemList.Count; i++) 
     { 
      Console.WriteLine(elemList[i].InnerText); 
     } 

別の解決策は、この方法で

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

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

使用すると、配列希望する場合:1でXML LINQのでそれをやって

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; 
0

を指示

ているXmlNodeListはgetElementsByTagNameの(でのご正常に評価するXPath式の結果である

xmlNodeList.Cast<XmlNode>().Select(n => n.InnerText).ToArray(); 

...):

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

     } 

    } 
} 
0

あなたの質問に直接答えがこれを行うことです。

しかし、あなたが考えるかもしれません:

  • いるXmlNodeListはすでに.Countプロパティを持っているので、あなたが本当に、配列を必要とするかどうか、あなたはXDocumentを使用しての代わりに、常にXmlDocument
  • の方がよいかもしれませんかどうか

これはいくつかのオプションを示しています:

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]); 
      } 
     } 
    } 
} 
関連する問題