【问题标题】:Count specific XML Nodes within XML计算 XML 中的特定 XML 节点
【发布时间】:2010-02-18 09:05:44
【问题描述】:

查看此 XML:


<CMP>
    <OMP3>
        <personmenu>
            <submenuid>502</submenuid>
            <submenuid>503</submenuid>
        </personmenu>
        <accountsmenu>
            <submenuid>517</submenuid>
            <submenuid>518</submenuid>
            <submenuid>519</submenuid>
        </accountsmenu>

        <reportsmenu>
            <submenuid>522</submenuid>
            <submenuid>528</submenuid>
            <submenuid>536</submenuid>
        </reportsmenu>
    </OMP3>

    <AMP3>
        <admissionmenu>
            <submenuid>702</submenuid>
            <submenuid>703</submenuid>
        </admissionmenu>
    </AMP3>
</CMP>

我想从这个 xml 中动态获取节点的总数(C#)。 我该怎么做?有示例代码吗?

【问题讨论】:

  • 您要统计哪些节点?
  • 全部计数是什么意思。您想计算子菜单元素或 xml 文档中的所有元素?

标签: c# asp.net xml


【解决方案1】:

这是一个计算 xml 文档中所有 submenuid 节点而不将其加载到内存中的示例:

var nodeCount = 0;
using (var reader = XmlReader.Create("test.xml"))
{
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && 
            reader.Name == "submenuid")
        {
            nodeCount++;
        }
    }
}
Console.WriteLine(nodeCount);

或者,如果您更喜欢 LINQ 到 XML:

var count = XDocument
    .Load("test.xml")
    .XPathSelectElements("//submenuid")
    .Count();

【讨论】:

    【解决方案2】:

    像这样使用 XmlDocument:

    XmlDocument xmlD = new XmlDocument();
    xmlD.Load(Server.MapPath("sample.xml"));
    XmlNodeList xmlNL = xmlD.GetElementsByTagName("tagName");
    xmlNL.Count;
    

    【讨论】:

      【解决方案3】:

      您也可以使用 XPath 函数“count”。这是一个例子。

      XPathDocument doc = new XPathDocument("c:\\test.xml");
      int count = (int)doc.CreateNavigator().Evaluate("count(//submenuid)");
      

      【讨论】:

      • 这对我有用,但我不得不加倍。这篇文章已经过去十年了,所以这很可能是自 2010 年以来 XML 库函数的变化。
      【解决方案4】:

      下面的代码是在XML Document中查找特定节点的计数

       private void browse_Click(object sender, EventArgs e)//file browse button
          {
              DialogResult result = openFileDialog1.ShowDialog();
              if (result == DialogResult.OK)
              {
                  String file = openFileDialog1.FileName;
                  if (Path.GetExtension(file) != ".xml")
                  {
                      MessageBox.Show("Please upload an vaild xml file");
                      textBox1.Clear();
                  }
                  else
                  {
                      textBox1.Text = file;
                  }
              }
          }  
       private void CountButton_Click(object sender, EventArgs e)//count button
          {
              int count = 0;
              string element = textBox2.Text;//Enter the node in the textbox
              XmlDocument readdoc = new XmlDocument();
                  readdoc.Load(textBox1.Text);
                  XmlElement root = readdoc.DocumentElement;
                  XmlNodeList node = root.GetElementsByTagName(element);
                  count = node.Count;
                  MessageBox.Show(string.Format("Count of {0} node in the uploaded xml file is {1}", element, count.ToString()));
          }
      

      【讨论】:

        【解决方案5】:

        如果您可以控制自己的 xml

        string xmlReturn="
        <CMP>
        <OMP3>
            <personmenu>
                <submenuid>502</submenuid>
                <submenuid>503</submenuid>
            </personmenu>
            <accountsmenu>
                <submenuid>517</submenuid>
                <submenuid>518</submenuid>
                <submenuid>519</submenuid>
            </accountsmenu>
        
            <reportsmenu>
                <submenuid>522</submenuid>
                <submenuid>528</submenuid>
                <submenuid>536</submenuid>
            </reportsmenu>
        </OMP3>
        
        <AMP3>
            <admissionmenu>
                <submenuid>702</submenuid>
                <submenuid>703</submenuid>
            </admissionmenu>
        </AMP3>
        </CMP>"
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.LoadXml(xmlReturn);
        XmlNodeList nodeListCount=xmldoc.GetElementsByTagName("submenuid");
        int nodeCount = nodeListCount.Count;
        Console.WriteLine(nodeCount);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-07
          相关资源
          最近更新 更多