在不知道确切结构的情况下计算重度嵌套的XmlNodes

时间:2015-06-27 03:08:48

标签: c# .net xml

我正在尝试计算用户上传的表单中的字段。这个'形式'作为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;
            //}

        }

2 个答案:

答案 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“//*”。

相同