Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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
Groovy XmlParser/XmlSlurper:node.localText()位置?_Groovy_Html Parsing_Xmlslurper - Fatal编程技术网

Groovy XmlParser/XmlSlurper:node.localText()位置?

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

我有一个关于这个问题的后续问题:

它解释了为了获取(HTML)节点的本地内部文本而不递归地获取潜在内部子节点的嵌套文本,必须使用
\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.
            '''
}