1

我有一个结构与此类似的 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>

我需要能够从每个成员节点中获取值以存储在数据表中。如果我使用 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[] {'>', '<'});
    }
}
4

5 回答 5

1

您可以使用 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);
            }

于 2015-06-30T15:37:47.113 回答
0

您需要在 中迭代子元素members,例如:

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

也就是说,除非您有特定的理由使用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();
于 2015-06-30T15:30:11.023 回答
0

这应该可以解决问题:

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

结果:

在此处输入图像描述

演示代码

于 2015-06-30T15:30:14.877 回答
0

您提供的 xml 无效。但是假设您只想将所有member节点的内部文本放入一个字符串数组中,我只需使用 Linq-To-Xml (XDocument):

var results = XDocument.Parse(xmlString)
                       .Descendants("member")
                       .Select(m => m.Value)
                       .ToArray();
于 2015-06-30T15:30:22.033 回答
0

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

var tempArrary = subNode.SelectNodes("member").OfType<XmlNode>().Select(n => n.InnerText).ToArray();
于 2015-06-30T15:33:32.173 回答