我有一个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&lt; \ member&gt;)
从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 :(得分: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);
}
答案 1 :(得分:0)
您需要在members
内迭代子元素,如下所示:
foreach (var node in grpNode["members"].ChildNodes)
{
var value = node.InnerText;
}
尽管如此,除非您有一些特定的理由使用XmlDocument
,否则最好使用LINQ to XML。这为您提供了更具表现力的代码,例如:
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();
答案 2 :(得分:0)
这应该可以解决问题:
XDocument xdoc = XDocument.Load(@"Path/to/file");
var result = xdoc.Descendants("member").Select (x => x.Value).ToArray();
结果:
答案 3 :(得分:0)
您提供的xml无效。但假设您只想将所有member
个节点的内部文本放入字符串数组中,我只使用Linq-To-Xml(XDocument):
var results = XDocument.Parse(xmlString)
.Descendants("member")
.Select(m => m.Value)
.ToArray();
答案 4 :(得分:0)
即使您使用旧的XmlDocument
API,通过引入.OfType<XmlNode>()
,您可以将XmlNodeList
转换为通用枚举,从而混合使用某些linq和lambda语法,例如:
var tempArrary = subNode.SelectNodes("member").OfType<XmlNode>().Select(n => n.InnerText).ToArray();