2015-06-30 2 views
1

У меня есть файл XML со структурой, аналогичной этойC# раскол XML InnerText или разобрать InnerXml

<entry name="something"> 
    <members> 
    <member>aaa</member> 
    <member>bbb</member> 
    </members> 
</entry> 
<entry name="something_else"> 
    <members> 
    <member>ccc</member> 
    <member>ddd</member> 
    </members> 
</entry> 

мне нужно, чтобы иметь возможность получить значения из каждого из узлов членов хранить в DataTable. если я использую свойство innertext, он объединяет значения (aaabbb). нет ничего заметного, чтобы разделить строку на. Я также могу использовать внутренний XML, но затем я просто получаю строку с XML-структурой (aaa bbb < \ member>)

Каков наилучший способ получить каждое значение из элементов XML и сохранить его в строке массив?

вот что я пытался.

foreach (XmlNode grpNode in GrpList) 
{ 
    subNode = grpNode.Attributes["name"]; 
    if (subNode != null) 
    { 
     Obj = grpNode.Attributes["name"].Value; 
    } 

    subNode = grpNode["members"]; 
    if (subNode != null) 
    { 
     string innerXml = string.Empty; 
     innerXml = grpNode["members"].InnerXml.ToString(); 

     string[] tempArrary = innerXml.Split(new char[] {'>', '<'}); 
    } 
} 

ответ

0

Вам нужно перебирать дочерние элементы в members, так что-то вроде:

foreach (var node in grpNode["members"].ChildNodes) 
{ 
    var value = node.InnerText; 
} 

, что сказал, вы бы лучше с помощью LINQ к XML, если у вас есть некоторые конкретные причины для использования XmlDocument. Это дает гораздо более выразительный код, например:

var doc = XDocument.Parse(xml); 

var something = doc.Descendants("entry") 
    .Where(e => (string)e.Attribute("name") == "something") 
    .Single(); 

var somethingMembers = something.Descendants("member") 
    .Select(e => e.Value) 
    .ToArray(); 
0

Это должно сделать трюк:

XDocument xdoc = XDocument.Load(@"Path/to/file"); 
var result = xdoc.Descendants("member").Select (x => x.Value).ToArray(); 

Результат:

enter image description here

Demo Code

0

XML, вы 'предоставлено недействительно. Но если вы просто хотите, чтобы внутренний текст всех member узлов в массив строк, я бы просто использовать Linq-To-Xml (XDocument):

var results = XDocument.Parse(xmlString) 
         .Descendants("member") 
         .Select(m => m.Value) 
         .ToArray(); 
0

Даже если вы используете старый XmlDocument API, с помощью бросать в .OfType<XmlNode>() вы можете преобразовать XmlNodeList в общем перечислим и тем самым смешать в некотором Linq и лямбде-синтаксисе, например:

var tempArrary = subNode.SelectNodes("member").OfType<XmlNode>().Select(n => n.InnerText).ToArray(); 
1

вы можете использовать Xpath перебирать Вход узлы и получить член в нем, как это

string xml = "<root><entry name='something'>" + 
 
       "<members>" + 
 
       "<member>aaa</member>" + 
 
       "<member>bbb</member>" + 
 
       "</members>" + 
 
      "</entry>" + 
 
      "<entry name='something_else'>" + 
 
       "<members>" + 
 
       "<member>ccc</member>" + 
 
       "<member>ddd</member>" + 
 
      "</members>" + 
 
      "</entry></root>"; 
 

 
      XmlDocument doc = new XmlDocument(); 
 
      doc.LoadXml(xml); 
 

 
      var memsList = doc.SelectNodes("//entry"); 
 
      foreach (XmlNode a in memsList) 
 
      { 
 
       Console.WriteLine(a.Attributes["name"].Value); 
 

 
       var memList = a.SelectNodes("members/member"); 
 

 
       foreach(XmlNode x in memList) 
 
        Console.WriteLine(x.InnerText); 
 
      }

+1

Это будет читать все 'member' узлы дважды. –

+0

Да, вы правы, обновил запрос xpath в своем ответе. Спасибо, что указали это. – XtremeBytes