HTMLAgilitliyPack:选择表单输入子节点不起作用

时间:2014-02-06 10:22:11

标签: xpath html-agility-pack

形式:

<form method="POST" name="contactform" action="form-handler.php"> 

    <label for='name'>Name:</label>

    <input type="text" name="name" />

    <label for='email'>Contact Number:</label>

    <input type="text" name="phone" /> 

    <label for='phone'>Email:</label>

    <input type="text" name="email" /> 

    <label for='message'>Requirements:</label> 

    <textarea name="message"></textarea>

    <input type="submit" value="Submit" name="submit" class="quoteButton" />

</form>

代码:

        HtmlNode.ElementsFlags.Remove("form");
        HtmlNodeCollection fromNodes = doc.DocumentNode.SelectNodes("//form");
        foreach (HtmlNode formNode in fromNodes)
        {
            var inputs = formNode.SelectNodes(".//input");
        }

“// input”有效,当我检查子路径时,我看到:

/html[1]/body[1]/div[1]/div[3]/div[2]/div[1]/div[1]/input[2]

这意味着,根据HAP,表单甚至不包括输入!

“.// input”选择当前formNode的子节点不起作用(返回null)!

如何解决此问题我添加了以下内容,但它不起作用

 HtmlNode.ElementsFlags.Remove("form"); 

有什么想法吗?

修改(+示例):

在下一个示例中,输入变量也为空。

        var doc = new HtmlDocument();
        doc.LoadHtml(@"
            <!DOCTYPE html>
            <html>
                <head>
                    <title>Form Test</title>
                </head>
                <body>
                    <form>
                        <input type=""text"" />
                        <input type=""reset"" />
                        <input type=""submit"" />
                    </form>
                </body>
            </html>
            ");

        HtmlNode.ElementsFlags.Remove("form");
        IEnumerable<HtmlNode> fromNodes = doc.DocumentNode.Descendants("form");
        foreach (HtmlNode formNode in fromNodes)
        {
            var inputs = formNode.SelectNodes(".//input");
        }

1 个答案:

答案 0 :(得分:2)

解决!

        HtmlNode.ElementsFlags.Remove("form");
在加载文档之前应该调用

我的坏:D