Java groovy xml解析函数

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

我希望有一个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</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解析更有效。