我正在尝试计算用户上传的表单中的字段。这个'形式'作为XML文档进入。一切都工作正常,但我遇到了一个问题,我需要计算表单中的所有字段,而我当前的代码只计算组和下面的一个级别。我需要我的代码进入这些组并计算字段。如果这些团体有团体,也要计算这些团体(继续......)。我甚至不知道嵌套组的数量是多少,因为它最终由用户来设计这个表单。这个表单可能有数千个字段,因此结构可以是任何字段。
因此,简而言之,我知道将提供以下XML:
<theFieldRoot>
<group1>
<field1></field1>
</group1>
<group2>
<field2></field2>
<group3>
<field3></field3>
</group3>
</group2>
</theFieldRoot>
预期结果为6
所以,我的问题是,我有一个xml文档,我想计算根节点<theFieldRoot>
下的所有嵌套节点,但是在这个根节点之后,我不知道它是怎么回事#39结构化。我只知道会有小组和领域。当结构未知时,如何计算theFieldRoot
下的每个元素?
C#:
private int FieldCount(XmlDocument xmlDoc)
{
int fields = 0;
XmlNode formSchema = xmlDoc.SelectSingleNode("Blah/Blah2");
XmlDocument fieldXml = new XmlDocument();
using (var sr = new StringReader("<theFieldRoot>" + formSchema.InnerText + "</theFieldRoot>"))
using (var xtr = new XmlTextReader(sr) { Namespaces = false })
{
fieldXml.Load(xtr);
XmlNode myFields = fieldXml.FirstChild;
foreach (XmlElement xEl in myFields)
{
if (xEl.HasChildNodes)
{
fields += 1;
}
fields += 1;
}
//if (myFields.HasChildNodes)
//{
// fields = myFields.ChildNodes.Count;
//}
}
答案 0 :(得分:3)
您可以使用XPath .//*
选择所有元素,无论它的名称是什么,无论它在当前元素下的哪个位置。然后你可以轻松地计算它们,例如:
int fields = formSchema.SelectNodes(".//*").Count;
工作示例:
var xml = @"<theFieldRoot>
<group1>
<field1></field1>
</group1>
<group2>
<field2></field2>
<group3>
<field3></field3>
</group3>
</group2>
</theFieldRoot>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNode formSchema = xmlDoc.DocumentElement;
int fields = formSchema.SelectNodes(".//*").Count;
Console.WriteLine(fields);
//output is : 6
<强> .NET Fiddle Demo 强>
答案 1 :(得分:1)
尝试Linq to xml:
var xdoc = XDocument.Load("file.xml");
int count = xdoc.Root.Descendants().Count(); // 6
后代与xpath“//*”。
相同