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
Groovy 如何在没有GPath/节点名称的情况下提取CDATA_Groovy_Cdata_Xmlslurper - Fatal编程技术网

Groovy 如何在没有GPath/节点名称的情况下提取CDATA

Groovy 如何在没有GPath/节点名称的情况下提取CDATA,groovy,cdata,xmlslurper,Groovy,Cdata,Xmlslurper,我试图从XML中提取CDATA内容,而不使用GPath(或)节点名。简而言之,我想从XML中查找和检索包含CDATA的innerText部分 我的XML看起来像: def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?> <root> <Test1>This node contains some innerText. Ignore This.</Test1>

我试图从XML中提取CDATA内容,而不使用GPath(或)节点名。简而言之,我想从XML中查找和检索包含CDATA的innerText部分

我的XML看起来像:

def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <Test1>This node contains some innerText. Ignore This.</Test1>
    <Test2><![CDATA[this is the CDATA section i want to retrieve]]></Test2>
</root>'''

正如@daggett所说,您不能用Groovy slurper或解析器来实现这一点,但是下拉并使用java类来实现也不太糟糕

注意:您必须将CDATA的属性设置为可见,因为默认情况下,它仅被视为字符

代码如下:

import javax.xml.stream.*

def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <Test1>This node contains some innerText. Ignore This.</Test1>
    <Test2><![CDATA[this is the CDATA section i want to retrieve]]></Test2>
</root>'''

def factory = XMLInputFactory.newInstance()
factory.setProperty('http://java.sun.com/xml/stream/properties/report-cdata-event', true)

def reader = factory.createXMLStreamReader(new StringReader(xml))
while (reader.hasNext()) {
    if (reader.eventType in [XMLStreamConstants.CDATA]) {
        println reader.text
    }
    reader.next()
}
import javax.xml.stream*
def xml=''
此节点包含一些内部文本。忽略这一点。
'''
def factory=XMLInputFactory.newInstance()
factory.setProperty('http://java.sun.com/xml/stream/properties/report-cdata-event",对)
def reader=factory.createXMLStreamReader(新的StringReader(xml))
while(reader.hasNext()){
if(reader.eventType在[XMLStreamConstants.CDATA]中){
println reader.text
}
reader.next()
}

这将打印
这是我想要检索的CDATA部分

考虑到您的xml中只有一个CDATA拆分可以在这里提供帮助

def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<Test1>This node contains some innerText. Ignore This.</Test1>
<Test2><![CDATA[this is the CDATA section i want to retrieve]]></Test2>
 </root>'''

 log.info xml.split("<!\\[CDATA\\[")[1].split("]]")[0]
这是它有效的证据


使用groovy xml解析器,您无法检测cdata。您必须使用DOM或其他xml解析器。Hmmm。。。不喜欢这个,不应该鼓励字符串操作来解析XML…的确,这不是很合乎逻辑,但在某些自定义情况下,它似乎是最好的解决方案。这是一个完美而可靠的解决方案。谢谢
import javax.xml.stream.*

def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <Test1>This node contains some innerText. Ignore This.</Test1>
    <Test2><![CDATA[this is the CDATA section i want to retrieve]]></Test2>
</root>'''

def factory = XMLInputFactory.newInstance()
factory.setProperty('http://java.sun.com/xml/stream/properties/report-cdata-event', true)

def reader = factory.createXMLStreamReader(new StringReader(xml))
while (reader.hasNext()) {
    if (reader.eventType in [XMLStreamConstants.CDATA]) {
        println reader.text
    }
    reader.next()
}
def xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<Test1>This node contains some innerText. Ignore This.</Test1>
<Test2><![CDATA[this is the CDATA section i want to retrieve]]></Test2>
 </root>'''

 log.info xml.split("<!\\[CDATA\\[")[1].split("]]")[0]
xml.split("<!\\[CDATA\\[")[1]
.split("]]")[0]