我正在尝试计算XML文档中的所有父节点。我见过像.SelectNodes("general/parent").Count
这样的解决方案,但这是一个固定的解决方案。问题是我必须使用生成的XML文档来完成它。所以我不知道XML结构。
我创建了一个例子。想象一下,生成以下文档,根本不知道任何标记名称或信息:
<?xml version="1.0" encoding="UTF-8"?>
<general>
<settings>
<resolution>1920x1080</resolution>
<version>1.0</version>
</settings>
<data>
<persons>
<person>
<name>Bob</name>
<age>41</age>
</person>
<person>
<name>Alex</name>
<age>25</age>
</person>
</persons>
</data>
</general>
我想浏览这份文件并得到以下结果:5。因为该文件有5个“父母”(一般,设置,数据,人和人)。但它不计算“决议”,“版本”,“名称”和“年龄”,因为他们没有孩子(不是父母)。但请再次注意,文档已生成!
我希望这个问题足够明确。有没有办法实现这个目标?
答案 0 :(得分:1)
使用LinqToXml,您可以执行以下操作:
XDocument.Parse(@"...").Descendants().Where(n => n.Elements().Any()).Select(n => n.Name).Distinct().Count();
答案 1 :(得分:1)
你需要一个递归算法,就像这个;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace GetMaxXMLDepth
{
class Program
{
static void Main(string[] args)
{
string doc = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<general>
<settings>
<resolution>1920x1080</resolution>
<version>1.0</version>
</settings>
<data>
<persons>
<person>
<name>Bob</name>
<age>41</age>
</person>
<person>
<name>Alex</name>
<age>25</age>
</person>
</persons>
</data>
</general>";
var xd = XDocument.Parse(doc);
int maxDepth = GetMaxChildDepth(xd.Root);
}
static int GetMaxChildDepth(XElement element)
{
int result = 1;
//always return 1 as the root node has depth of 1.
//in addition, return the maximum depth returned by this method called on all the children.
if (element.HasElements)
result += element.Elements().Max(p => GetMaxChildDepth(p));
return result;
}
}
}
答案 2 :(得分:0)
int count = ParentNode.SelectNodes(ChildNodesXPath).Count;