0

我是 XPath 的新手……我希望,给定一个任意的 HTML 文档,我可以提取所有节点的 XPath 表达式列表。例如:

html
html/head
html/head/title
html/body
html/body/div
html/body/div/p
...

这是一个SSCCE来说明我想要什么:

    static void Main(string[] args)
    {
        String html = @"
        <html>
        <head>
            <title>Test</title>
        </head>
        <body>
            <div>
                <p>Test2</p>
            </div>
        </body>
        </html>
        ";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(html);

        foreach (XmlNode node in doc.ChildNodes)
            ExamineNode(node);

    }

    static void ExamineNode(XmlNode node)
    {
        Console.WriteLine(/* WHAT TO PUT HERE */); // I want to show the path to this node

        foreach (XmlNode childNode in node.ChildNodes)
            ExamineNode(childNode);
    }

我只是不知道要使用什么属性,或者如何计算路径。一种方法可能是使用节点名称并在遍历节点时构建一个字符串......但我认为可能有更好的方法。我正在寻找最好的方法来做到这一点。

类似的问题已经在这里这里提出,但我正在寻找有关如何以尽可能简单的方式在 C# 中实现此功能的提示。

4

1 回答 1

2

我发现了一个有点类似的问题,并且没有像 node.Path 之类的简单答案(就像我希望的那样),所以我继续进行了一个快速而肮脏的实现。

这是我最终使用的代码:

    static void Main(string[] args)
    {
        String html = @"
        <html>
        <head>
            <title>Test</title>
        </head>
        <body>
            <div>
                <p>Test2</p>
            </div>
        </body>
        </html>
        ";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(html);

        foreach (XmlNode node in doc.ChildNodes)
            ExamineNode(node, "");

        Console.ReadLine();
    }

    static void ExamineNode(XmlNode node, String parentPath)
    {
        String nodePath = parentPath + '/' + node.Name;

        if (!(node is XmlText))
        {
            Console.WriteLine(nodePath); // I want to show the path to this node

            foreach (XmlNode childNode in node.ChildNodes)
                ExamineNode(childNode, nodePath);
        }
    }

它可能不是最有效的(例如不使用 StringBuilder),但它很简单并且可以完成所需的任务。

只是希望有一天有人会发现这很有用。

于 2013-02-13T19:45:38.303 回答