如何在 C# 中解析多个元素属性值
Posted
技术标签:
【中文标题】如何在 C# 中解析多个元素属性值【英文标题】:How to parse multiple element attribute values in C# 【发布时间】:2020-05-05 07:06:20 【问题描述】:我有下面的xml;
<Main>
<Item ItemID="123456">
<Devtm PL="SP"></Devtm>
<Devtm PL="RV"></Devtm>
</Item>
</Main>
我正在尝试获取属于 Devtm 元素的所有值。该元素可以有多个带有 PL 属性的值。
using (WebResponse response = request.GetResponse())
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
string soapResult = rd.ReadToEnd();
var xdoc = XDocument.Parse(soapResult);
var lineItemDetails = xdoc.Descendants("Main");
foreach (var lineItemDetail in lineItemDetails)
var Devtm = lineItemDetail.Element("Item")?.Element("Devtm")?.Attribute("PL")?.Value;
Console.WriteLine(Devtm);
这只是给了我第一个元素值,即“SP”。我怎样才能得到第二个值呢?我不需要循环,因为我知道那里只有 2 个值。
由于某些原因,LINQ 也不是一个选项。如何使用 XDocument 实现它?
【问题讨论】:
【参考方案1】:您可以稍微重写代码以获得预期的结果。使用Descendants
方法访问Item
元素,然后遍历其节点
var lineItemDetails = xdoc.Root?.Descendants("Item");
foreach (var lineItemDetail in lineItemDetails?.Nodes().OfType<XElement>())
var Devtm = lineItemDetail?.Attribute("PL")?.Value;
Console.WriteLine(Devtm);
它打印SP
和RV
。
如果你想使用基于索引的访问,没有循环,这会有所帮助
var lineItemDetails = xdoc.Root?.DescendantsAndSelf("Item").FirstOrDefault();
var nodes = lineItemDetails?.DescendantNodes().OfType<XElement>().ToList();
Console.WriteLine(nodes?[0]?.Attribute("PL")?.Value);
Console.WriteLine(nodes?[1]?.Attribute("PL")?.Value);
【讨论】:
有没有办法将它分配给另一个变量,如 var Devtm[0] 或 var Devtm[1]? @sensahin 我已经更新了基于索引访问的代码 是否可以通过 foreach 循环使用索引访问?您提供的第一个解决方案? 对不起,不明白为什么/这没有意义,您在使用索引访问特定元素的循环中逐个访问元素以上是关于如何在 C# 中解析多个元素属性值的主要内容,如果未能解决你的问题,请参考以下文章
如何搜索 xml 节点值,然后在 c# 中为该元素创建新属性
如何在将 xml 反序列化为 c# 对象时获取单个 xml 元素的多个值?
如何使用 regex.split 在 c# 中解析 html 并返回值数组