简体   繁体   English

C#拆分xml innertext或解析innerxml

[英]C# split xml innertext or parse innerxml

I have an XML file with a structure similar to this 我有一个结构与此类似的XML文件

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

I need to be able to get the values out of each of the member nodes to store in a datatable. 我需要能够从每个成员节点中获取值以存储在数据表中。 if i use the innertext property, it concatenates the values (aaabbb). 如果我使用innertext属性,它将连接值(aaabbb)。 there is nothing discernible to split the string on. 没有任何可分割的字符串。 I can also use the inner XML but then i just get a string with the XML structure (aaa bbb<\\member>) 我也可以使用内部XML,但是随后我得到的是XML结构的字符串(aaa bbb <\\ member>)

What is the best way to get each value out of the XML elements and store it in a string array? 从XML元素中获取每个值并将其存储在字符串数组中的最佳方法是什么?

here is what I have been trying. 这是我一直在尝试的。

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[] {'>', '<'});
    }
}

You can use Xpath to iterate through Entry nodes and get the members within it like this 您可以使用Xpath遍历Entry节点并像这样获取其中的成员

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

You need to iterate the child elements within members , so something like: 您需要遍历内的子元素members ,所以是这样的:

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

That said, you would be better off using LINQ to XML unless you have some specific reason to use XmlDocument . 就是说,最好使用LINQ to XML,除非您有特定的理由使用XmlDocument This gives you much more expressive code, for example: 这为您提供了更具表现力的代码,例如:

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

This should do the trick: 这应该可以解决问题:

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

Result: 结果:

在此处输入图片说明

Demo Code 示范代码

the xml you've provided isn't valid. 您提供的xml无效。 But assuming you just want the inner text of all member nodes into a string array, I'd just use Linq-To-Xml (XDocument): 但是,假设您只想将所有member节点的内部文本转换为字符串数组,则只使用Linq-To-Xml(XDocument):

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

即使您使用的是旧版XmlDocument API,也可以通过抛出.OfType<XmlNode>()来将XmlNodeList转换为通用枚举,从而混合使用一些linq和lambda语法,例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM