Java groovy xml解析函数
我希望有一个groovy函数,它可以接受2个或更多参数,比如Java groovy xml解析函数,java,groovy,Java,Groovy,我希望有一个groovy函数,它可以接受2个或更多参数,比如input,find\u tag 我写了下面这样的东西来测试(不是函数),但它没有给我D_1164898448。请帮帮我 def temp="""<Portals objVersion=\"1.1.19\"> <vector xsi:type=\"domainservice:Portals\" objVersion=\"1.1.19\"> <domainName>D_1164898448</d
input
,find\u tag
我写了下面这样的东西来测试(不是函数),但它没有给我D_1164898448
。请帮帮我
def temp="""<Portals objVersion=\"1.1.19\">
<vector xsi:type=\"domainservice:Portals\" objVersion=\"1.1.19\">
<domainName>D_1164898448</domainName>
<address xsi:type=\"metadata:NodeRef\" objVersion=\"1.1.19\">
<host>Komodo</host>
<port>18442</port>
</address>
</vector>
</Portals>"""
def fInput="domainName"
def records = new XmlParser().parseText(temp)
def t=records.findAll{ it.fInput}.text()
println t
但像wise一样,如何为节点执行此操作
println "host = ${records.vector.address.host.text()}"
您需要做的是:
- 关闭名称空间感知,这样XmlParser在遇到未绑定的
前缀时不会抛出错误。您可以通过向xsi:
构造函数传递正确的参数来实现XmlParser
- 正确遍历解析器返回的DOM树-它返回一个
,而不是列表,并且使用节点
所使用的方式将无法工作findAll
- (可选)删除XML中双引号之前的反斜杠,因为不需要在heredoc中转义双引号
def temp="""
<Portals objVersion="1.1.19">
<vector xsi:type="domainservice:Portals" objVersion="1.1.19">
<domainName>D_1164898448</domainName>
<address xsi:type="metadata:NodeRef" objVersion="1.1.19">
<host>Komodo</host>
<port>18442</port>
</address>
</vector>
</Portals>
"""
def fInput="domainName"
def records= new XmlParser(false, false).parseText(temp)
def t = records.vector."$fInput".text()
println t
def temp=”“”
迪乌1164898448
科莫多
18442
"""
def fInput=“域名”
def records=newxmlparser(false,false).parseText(temp)
def t=records.vector.“$fInput.text()
println t
运行它会如预期的那样显示“D_1164898448”。您需要做的是:
- 关闭名称空间感知,这样XmlParser在遇到未绑定的
前缀时不会抛出错误。您可以通过向xsi:
构造函数传递正确的参数来实现XmlParser
- 正确遍历解析器返回的DOM树-它返回一个
,而不是列表,并且使用节点
所使用的方式将无法工作findAll
- (可选)删除XML中双引号之前的反斜杠,因为不需要在heredoc中转义双引号
def temp="""
<Portals objVersion="1.1.19">
<vector xsi:type="domainservice:Portals" objVersion="1.1.19">
<domainName>D_1164898448</domainName>
<address xsi:type="metadata:NodeRef" objVersion="1.1.19">
<host>Komodo</host>
<port>18442</port>
</address>
</vector>
</Portals>
"""
def fInput="domainName"
def records= new XmlParser(false, false).parseText(temp)
def t = records.vector."$fInput".text()
println t
def temp=”“”
迪乌1164898448
科莫多
18442
"""
def fInput=“域名”
def records=newxmlparser(false,false).parseText(temp)
def t=records.vector.“$fInput.text()
println t
运行它会显示“D_116489848”,正如预期的那样。我认为您必须在这里使用XPath表达式,或者如果您输入的xml确实如您所示,我建议您使用regexp
def temp = ".." //your temp
def m = temp =~ /<domainName>(.*)</domainName>/
print m[0][1] // should be your domain
def temp=“…”//your temp
def m=temp=~/(.*)/
打印m[0][1]//应该是您的域
关于groovy regexp的更多信息我认为您必须在这里使用XPath表达式,或者,如果您像前面提到的那样输入xml,我建议您使用类似于
def temp = ".." //your temp
def m = temp =~ /<domainName>(.*)</domainName>/
print m[0][1] // should be your domain
def temp=“…”//your temp
def m=temp=~/(.*)/
打印m[0][1]//应该是您的域
关于groovy regexp的更多信息如果您不知道要搜索的XML标记的确切路径,可以执行类似操作以获取具有给定名称的所有标记的内容:
def t = records."**"."$fInput".text()
要从给定的XML节点访问属性,还可以使用@
表示法,例如
records.vector.@objVersion
如果不知道要搜索的XML标记的确切路径,可以执行以下操作以获取具有给定名称的所有标记的内容:
def t = records."**"."$fInput".text()
要从给定的XML节点访问属性,还可以使用@
表示法,例如
records.vector.@objVersion
是否有类似于
${records.attribute(“id”)}“
要获取节点,我可以在其中代替id
给出节点的完整DOM树路径?XmlReader返回一个groovy.util.node
,它与DOM节点不同,因此不支持XPath表达式。它支持的是GPath表达式,如下所述:。看看你能不能用这个。如果没有,并且需要完整的XPath支持,则可能需要使用外部库;请参阅是否有类似于${records.attribute(“id”)}的内容“
要获取节点,我可以在其中代替id
给出节点的完整DOM树路径?XmlReader返回一个groovy.util.node
,它与DOM节点不同,因此不支持XPath表达式。它支持的是GPath表达式,如下所述:。看看你能不能用这个。如果没有,并且需要完整的XPath支持,则可能需要使用外部库;查看如何解析(.*)
?因为当我使用println“(.*)”
时,它只会给我(.*)
对不起,我想你对Groovy Regexp很熟悉。用“更多解释”编辑。@AlexeySviridov您建议用Regexp解析XML?真的吗?@tim_yates我指的是简单的事情。并不总是需要复杂地解析xml,特别是当xml包含三行时,并且需要在两个标记之间使用一个简单的值(当然,这不适用于大型和复杂的层次结构)。重读我的答案,我是“准确的”高级词汇。对于这个问题,regexp比完整的xml解析更有效。如何解析(.*)
?因为当我使用println“(.*)”
时,它只会给我(.*)
对不起,我想你对Groovy Regexp很熟悉。用“更多解释”编辑。@AlexeySviridov您建议用Regexp解析XML?真的吗?@tim_yates我指的是简单的事情。并不总是需要复杂地解析xml,特别是当xml包含三行时,并且需要在两个标记之间使用一个简单的值(当然,这不适用于大型和复杂的层次结构)。重读我的答案,我是“准确的”高级词汇。在这个问题上,regexp比完整的xml解析更有效。