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);
    }

使用する属性や、パスの計算方法がわかりません。1つの方法は、ノード名を使用してノードをトラバースしながら文字列を作成することです...しかし、もっと良い方法があるのではないかと思いました。私はこれを行うための最良の方法を探しています。

ここここで同様の質問がありますが、これを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 に答える