Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Golang Gokogiri递归xpath异常_Xml_Xpath_Recursion_Go - Fatal编程技术网

Xml Golang Gokogiri递归xpath异常

Xml Golang Gokogiri递归xpath异常,xml,xpath,recursion,go,Xml,Xpath,Recursion,Go,我试图对html文档执行xpath操作。我想做一个两级xpath查询。html文档“index.html”如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div class="head">

我试图对html文档执行xpath操作。我想做一个两级xpath查询。html文档“index.html”如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="head">
        <div class="area">
            <div class="value">10</div>
        </div>
        <div class="area">
            <div class="value">20</div>
        </div>
        <div class="area">
            <div class="value">30</div>
        </div>
    </div>
</body>
</html>
但是,我得到的输出是奇数:

10
20
30
10
20
30
10
20
30
我打算:

10
20
30

我想递归地搜索xpath模式。我认为我的第二级xpath模式有问题。看起来,我的第二级xpath再次是在整个文档中搜索,而不是使用class=“area”搜索单个div。对于递归xpath模式搜索,我该怎么做?非常感谢您的帮助。

来自任何节点的XPath搜索仍然可以搜索整个树

如果只想搜索子树,可以使用
(假设您仍然需要后代或自身)启动表达式,否则使用精确路径

xps := xpath.Compile("//div[@class='head']/div[@class='area']")
xpw := xpath.Compile(".//div[@class='value']")

// this works in your example case
// xpw := xpath.Compile("div[@class='value']")
// as does this
// xpw := xpath.Compile("./div[@class='value']")

ss, _ := doc.Root().Search(xps)
for _, s := range ss {
    ww, _ := s.Search(xpw)
    for _, w := range ww {
        fmt.Println(w.InnerHtml())
    }
}
印刷品:

10
20
30

您的第二个查询
//div[@class='value']
,将选择文档中任意位置的div,而不管父元素是什么。相反,请尝试
div[@class='value']

您好,谢谢!这确实解决了问题。顺便说一句,第二个xpath
//div[@class='value']
,它不是在当前上下文中搜索的吗?如果
div.value
位于
div.area
下的DOM深处,而我想搜索
div.value
,该怎么办?刚才看到了您的问题。供将来参考。。。是的,它是从当前上下文(上下文节点)开始的。但是由于XPath表达式以
/
开头,所以上下文节点没有区别,除了确定
/
与哪个文档相关。如果希望XPath表达式仅选择作为上下文节点后代的
div
元素,请使用
//div[…]
(注意前面的点)。是的,这解决了我的问题。“点”有什么用?那个“点”,它表示当前节点吗?但是在for循环中,如果
s
在上下文中,那么
//div[@class='value']
也有意义,对吗?我之所以这么说,是因为如果每次迭代中的根元素是
div.area
,那么
//div[@class='value']
就有意义了。@ArunL:
//
/genderant或self::node()//
的缩写,因此它本身的第一个斜线表示树根。
self::node()
的别名。(我确信有一个比维基百科更好的参考资料)也注意到与任何文件系统的相似性,其中
代表当前目录
10
20
30