Groovy XmlParser/XmlSlurper:node.localText()位置?
我有一个关于这个问题的后续问题: 它解释了为了获取(HTML)节点的本地内部文本而不递归地获取潜在内部子节点的嵌套文本,必须使用Groovy XmlParser/XmlSlurper:node.localText()位置?,groovy,html-parsing,xmlslurper,Groovy,Html Parsing,Xmlslurper,我有一个关于这个问题的后续问题: 它解释了为了获取(HTML)节点的本地内部文本而不递归地获取潜在内部子节点的嵌套文本,必须使用\localText()而不是\text() 例如,原始问题中的一个稍微增强的示例: <html> <body> <div> Text I would like to get1. <a href="http://intro.com">extra stu
\localText()
而不是\text()
例如,原始问题中的一个稍微增强的示例:
<html>
<body>
<div>
Text I would like to get1.
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</div>
<span>
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</span>
</body>
</html>
将返回:
[Text I would like to get1., Text I would like to get2., Text I would like to get3.]
但是,在解析本例中的
部分时
println htmlParsed.body.span[0].localText()
输出是
[Text I would like to get2., Text I would like to get3.]
我现在面临的问题是,显然不可能精确定位文本的位置(“哪个子节点之间”)。我本以为第二次调用会产生结果
[, Text I would like to get2., Text I would like to get3.]
这就清楚了:位置0(在子0之前)是空的,位置1(在子0和1之间)是“文本我想获取2”,位置2(在子1和2之间)是“文本我想获取3”。但是鉴于API的工作原理,显然无法确定在索引0处返回的文本是否实际位于索引0或任何其他索引处,对于所有其他索引也是如此
我已经用XmlSlurper
和XmlParser
尝试过了,得到了相同的结果
如果我没有弄错的话,因此也不可能使用解析器中的信息完全重新创建原始HTML文档,因为这个“文本索引”信息丢失了
我的问题是:有没有办法找出这些文本位置?要求我更改解析器的答案也是可以接受的
更新/解决方案: 为了进一步参考,以下是Will p的答案,适用于原始代码:
def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()
def slurper = new XmlParser(tagsoupParser)
def htmlParsed = slurper.parseText(stringToParse)
println htmlParsed.body.div[0].children().collect {it in String ? it : null}
这将产生:
[Text I would like to get1., null, Text I would like to get2., null, Text I would like to get3.]
必须使用
XmlParser
而不是XmlSlurper
和node.children()
我不知道jsoup,我希望它不会干扰解决方案,但是使用纯XmlParser
可以得到一个children()
数组,其中包含原始字符串:
html = '''<html>
<body>
<div>
Text I would like to get1.
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</div>
<span>
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</span>
</body>
</html>'''
def root = new XmlParser().parseText html
root.body.div[0].children().with {
assert get(0).trim() == 'Text I would like to get1.'
assert get(0).getClass() == String
assert get(1).name() == 'a'
assert get(1).getClass() == Node
assert get(2) == '''
Text I would like to get2.
'''
}
html=''
我想得到的文本1。
文本我想得到2。
文本我想得到3。
文本我想得到2。
文本我想得到3。
'''
def root=new XmlParser().parseText html
root.body.div[0].children().with{
断言get(0).trim()==“我想获取的文本1。”
断言get(0).getClass()==String
断言get(1).name()=='a'
断言get(1).getClass()==节点
断言get(2)='''
文本我想得到2。
'''
}
就是这样!显然,它只适用于XmlParser,而不适用于XmlSlurper。非常感谢。我将用解决方案更新我的问题。我只希望Groovy能够更清楚地记录这两个类之间的差异。。。
html = '''<html>
<body>
<div>
Text I would like to get1.
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</div>
<span>
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</span>
</body>
</html>'''
def root = new XmlParser().parseText html
root.body.div[0].children().with {
assert get(0).trim() == 'Text I would like to get1.'
assert get(0).getClass() == String
assert get(1).name() == 'a'
assert get(1).getClass() == Node
assert get(2) == '''
Text I would like to get2.
'''
}