如何遍历xml节点并检查属性值?

如何遍历xml节点并检查属性值?,xml,groovy,xmlslurper,Xml,Groovy,Xmlslurper,我有这个xml,我把它放在xmlGPathResult对象中如何使用groovy xml slurping检查Microsoft(R)Windows(R)Server 2003企业版x64版本,将字段值设置为OS名称 <client productname="abp"> <machine> <env> <variable name='ALLUSERSPROFILE' value='C:\Documents and Settings\All Us

我有这个xml,我把它放在xml
GPathResult对象中
如何使用groovy xml slurping检查
Microsoft(R)Windows(R)Server 2003企业版x64版本
,将
字段
值设置为
OS名称

<client productname="abp">
<machine>
  <env>
   <variable name='ALLUSERSPROFILE' value='C:\Documents and Settings\All Users' />
   <variable name='APPDATA' value='C:\Documents and Settings\Administrator\Application Data' />
   <variable name='OS' value='Windows_NT' />
   <variable name='COMPUTERNAME' value='AbhishekPC' />
 </env>
 <osinfo>
    <osinfo field='OS Name' information='Microsoft(R) Windows(R) Server 2003 Enterprise x64 Edition' />
    <osinfo field='OS Version' information='5.2.3790 Service Pack 2 Build 3790' />
    <osinfo field='OS Manufacturer' information='Microsoft Corporation' />
    <osinfo field='OS Configuration' information='Standalone Server' />
    <osinfo field='OS Build Type' information='Multiprocessor Free' />
 </osinfo>
</machine>
</client>
此处
HI 1
打印所有环境名称属性值,但
HI 2
仅打印
HI 2

这是快照

这是我穿越后解决的问题

      def    vals1=gpathResult.machine.env.variable.findAll{it.@name=='COMPUTERNAME'}.@value.text()
            println vals1
            csmSummary.hostname=vals1
            def vals2=gpathResult.machine.env.variable.findAll{it.@name=='OS'}.@value.text()
            println vals2
            csmSummary.osname=vals2
奇怪。。。如果我这样做(使用Groovy 1.8)

您可以尝试一下该代码吗(假设您使用的是Groovy的最新版本1.8——如果不是,您将需要使用
“”“
而不是
$/
作为字符串分隔符,并转义
\
字符)

[编辑]可能只是因为您使用的是
gpathResult.machine.environment.variable
而不是
gpathResult.machine.env.variable

要遍历环境节点,请执行以下操作:

gpathResult.machine.env.variable.each { node ->
  println "${node.@name.text()} contains ${node.@value.text()}"
}
奇怪……如果我这样做(使用Groovy 1.8)

您可以尝试一下该代码吗(假设您使用的是Groovy的最新版本1.8——如果不是,您将需要使用
“”“
而不是
$/
作为字符串分隔符,并转义
\
字符)

[编辑]可能只是因为您使用的是
gpathResult.machine.environment.variable
而不是
gpathResult.machine.env.variable

要遍历环境节点,请执行以下操作:

gpathResult.machine.env.variable.each { node ->
  println "${node.@name.text()} contains ${node.@value.text()}"
}


你有用于将xml解析为
gpathResult
变量的代码吗?@tim_yates:有,我会在几分钟后发布
gpathResult
是如何创建的(
XmlSlurper
等?)。这是我的问题…@tim:现在检查,文件路径是正确的,因为这是我打印其他东西的方式onscreen@tim_yates:我想我可能可以遍历所有osinfo,然后检查
字段
名称(如果存在),然后打印特定的
信息
属性。那么我如何遍历这个osinfo并检查字段attribs/你有没有用于将xml解析为
gpathResult
变量的代码?@tim_yates:有,我会在一分钟后发布它
gpathResult
是如何创建的(
XmlSlurper
,等等?)这是我的问题…@tim:现在检查,文件路径是正确的,因为这是我打印其他东西的方式onscreen@tim_yates:我想我可能可以遍历所有osinfo,然后检查
字段
名称(如果存在),然后打印特定的
信息
属性。因此,我如何遍历此osinfo并检查字段attribs/HI 1是否正确打印,但HI 2仍然不打印任何内容,并且在我的系统中,它的
环境
而不是
环境
。另外,我正在使用groovy 1.8,我将在一分钟内创建一个快照,请检查我的question@Abhishek那一定是你没有告诉我们的。由于XML和代码不匹配,我猜它们中的任何一个都有问题,并且您没有在这里发布正确的信息以供我们帮助您。您运行的是上面的代码吗,它没有为
HI 2
打印任何内容?好的,请告诉我如何遍历每个环境。变量元素,以便我可以尝试其他内容,可能是我复制粘贴了您的
println
语句,在这里我只发布了一点xml,我不想透露部分xml和节点名称也不一样,但我在编辑时很谨慎,这就是为什么env被误认为是环境问题。我想问题一定是您有
OSinfo
OSinfo
或其他什么,而不是
OSinfo
,因为您在此处发布的HI 1打印正确,但是HI 2仍然不打印任何内容,在我的系统中,它的
环境
,而不是
环境
。另外,我正在使用groovy 1.8,我将在一分钟内创建一个快照,请检查我的question@Abhishek那一定是你没有告诉我们的。由于XML和代码不匹配,我猜它们中的任何一个都有问题,并且您没有在这里发布正确的信息以供我们帮助您。您运行的是上面的代码吗,它没有为
HI 2
打印任何内容?好的,请告诉我如何遍历每个环境。变量元素,以便我可以尝试其他内容,可能是我复制粘贴了您的
println
语句,在这里我只发布了一点xml,我不想透露部分xml和节点名称也是不同的,但我在编辑时很谨慎,这就是为什么env被误认为是环境问题。我想问题一定是您有
OSinfo
OSinfo
或其他什么,而不是您在这里发布的
OSinfo
HI 1 [ALLUSERSPROFILE, APPDATA, OS, COMPUTERNAME]
HI 2 [OS Name, OS Version, OS Manufacturer, OS Configuration, OS Build Type]
gpathResult.machine.env.variable.each { node ->
  println "${node.@name.text()} contains ${node.@value.text()}"
}