根据属性值获取元素的索引
本文关键字:元素 索引 获取 属性 | 更新日期: 2023-09-27 18:12:30
情况:我有一个XML文件(大部分是布尔逻辑)。我想做的是:通过节点中属性的内部文本获取节点的索引。然后将子节点添加到给定的索引。
的例子:
<if attribute="cat">
</if>
<if attribute="dog">
</if>
<if attribute="rabbit">
</if>
我可以得到一个给定元素名称的索引列表
GetElementsByTagName("if");
但是我如何通过使用属性的innertext来获得节点列表中节点的索引呢?
基本上是按照
的思路思考Somecode.IndexOf.Attribute.Innertext("dog").Append(ChildNode);
以这个结尾
<if attribute="cat">
</if>
<if attribute="dog">
<if attribute="male">
</if>
</if>
<if attribute="rabbit">
</if>
创建节点并将其插入索引,我没有问题。只是需要一个方法来获取索引
linq select函数有一个覆盖,它提供当前索引:
string xml = @"<doc><if attribute=""cat"">
</if>
<if attribute=""dog"">
</if>
<if attribute=""rabbit"">
</if></doc>";
XDocument d = XDocument.Parse(xml);
var indexedElements = d.Descendants("if")
.Select((node, index) => new Tuple<int, XElement>(index, node)).ToArray() // note: materialise here so that the index of the value we're searching for is relative to the other nodes
.Where(i => i.Item2.Attribute("attribute").Value == "dog");
foreach (var e in indexedElements)
Console.WriteLine(e.Item1 + ": " + e.Item2.ToString());
Console.ReadLine();
为了完整起见,这与上面的Nathan的回答相同,只是使用匿名类而不是Tuple:
using System;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
string xml = "<root><if attribute='"cat'"></if><if attribute='"dog'"></if><if attribute='"rabbit'"></if></root>";
XElement root = XElement.Parse(xml);
int result = root.Descendants("if")
.Select(((element, index) => new {Item = element, Index = index}))
.Where(item => item.Item.Attribute("attribute").Value == "dog")
.Select(item => item.Index)
.First();
Console.WriteLine(result);
}
}
}