簡體   English   中英

計算 XML 文檔中的父節點

[英]Count parent nodes in XML Document

我正在嘗試計算 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 個“父項”(常規、設置、數據、人員和人員)。 但這不包括“分辨率”、“版本”、“姓名”和“年齡”,因為他們沒有孩子(沒有父母)。 但再次提醒,文檔是生成的!

我希望這個問題足夠清楚。 有沒有辦法實現這一目標?

使用 LinqToXml,您可以執行以下操作:

XDocument.Parse(@"...").Descendants().Where(n => n.Elements().Any()).Select(n => n.Name).Distinct().Count();

你需要一個遞歸算法,就像這個;

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;
        }
    }
}
int count = ParentNode.SelectNodes(ChildNodesXPath).Count;                    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM