如何使用Groovy XmlParser提供动态XPath来从xml获取数据?
我有这个xml,需要获取CPU信息,但是标签如何使用Groovy XmlParser提供动态XPath来从xml获取数据?,groovy,Groovy,我有这个xml,需要获取CPU信息,但是标签CPU“1”数字部分可能会改变。我如何给出一个xpath,以便它像tilln那样动态地映射数字部分 我的Xml内容 <CLIENT> <SYSTEM> <CPU1 NUMBER="2" SPEED="2300 MHz" Vendor="Advanced Micro Devices" BRAND="AMD Opteron(tm) Processor 6134"></CPU1> <CPU2 NUMBER
CPU“1”
数字部分可能会改变。我如何给出一个xpath,以便它像tilln
那样动态地映射数字部分
我的Xml内容
<CLIENT>
<SYSTEM>
<CPU1 NUMBER="2" SPEED="2300 MHz" Vendor="Advanced Micro Devices" BRAND="AMD Opteron(tm) Processor 6134"></CPU1>
<CPU2 NUMBER="3" SPEED="2300 MHz" Vendor="Advanced Micro Devices" BRAND="AMD Opteron(tm) Processor 6134"></CPU2>
</SYSTEM>
</CLIENT>
目前,我从给定的代码中生成了类似于下面的xml
<client>
<system>
<cpuinfo>
<cpu Name="AMD Opteron(tm) Processor 6134" L2CacheSize="NA" MaxClockSpeed="2300 MHz" LoadPercentage="NA"/>
</cpuinfo>
</system>
</client>
我的代码
@XStreamAlias("cpu")
class cpu{
@XStreamAsAttribute
String Name
@XStreamAsAttribute
String L2CacheSize
@XStreamAsAttribute
String MaxClockSpeed
@XStreamAsAttribute
String LoadPercentage
public cpu(String name, String l2CacheSize, String maxClockSpeed,String loadPercentage) {
super();
Name = name;
L2CacheSize = l2CacheSize;
MaxClockSpeed = maxClockSpeed;
LoadPercentage = loadPercentage;
}
}
@XStreamAlias("system")
public class WindowsSystem extends CSMSystem{
List<cpu> cpuinfo
public WindowsSystem(CSMConfig config, String fileContent){
super(config)
cpuinfo = new ArrayList<cpu>()
WindowsHelper wh=new WindowsHelper(fileContent)
cpuinfo=wh.getCpuInfo(cpuinfo)
}
}
class WindowsHelper {
private def root
private List<cpu> cpuinfo
WindowsHelper(String fileContents)
{
root=new XmlParser(false,false).parseText(fileContents)
}
def getCpuInfo(List<cpu> cpuinfo)
{
try{
def cpusize="${root.SYSTEM.CPU1.size()}"
if(cpusize>0){
root.SYSTEM.CPU1.each{
cpuinfo.add(new cpu(it.@BRAND,"NA",it.@SPEED,"NA"))
}
return cpuinfo
}
else{
cpuinfo.add(new cpu("NA","NA","NA","NA"))
return cpuinfo
}
}
catch(Exception e){
println "getCpuInfo "+e
}
}
}
@XStreamAlias(“cpu”)
类cpu{
@XStreamAsAttribute
字符串名
@XStreamAsAttribute
字符串L2CacheSize
@XStreamAsAttribute
字符串最大时钟速度
@XStreamAsAttribute
字符串加载百分比
公共cpu(字符串名称、字符串l2CacheSize、字符串maxClockSpeed、字符串加载百分比){
超级();
名称=名称;
L2CacheSize=L2CacheSize;
MaxClockSpeed=MaxClockSpeed;
装载百分比=装载百分比;
}
}
@XStreamAlias(“系统”)
公共类WindowsSystem扩展了CSMSSystem{
列表cpuinfo
公共Windows系统(CSMConfig配置,字符串文件内容){
超级(配置)
cpuinfo=newarraylist()
WindowsHelper wh=新的WindowsHelper(文件内容)
cpuinfo=wh.getCpuInfo(cpuinfo)
}
}
类WindowsHelper{
私有def根
私有列表cpuinfo
WindowsHelper(字符串文件内容)
{
root=newXMLParser(false,false).parseText(fileContents)
}
def getCpuInfo(列出cpuinfo)
{
试一试{
def cpusize=“${root.SYSTEM.CPU1.size()}”
如果(cpusize>0){
root.SYSTEM.CPU1.each{
添加(新的cpu(它。@BRAND,“NA”,它。@SPEED,“NA”))
}
返回cpuinfo
}
否则{
添加(新cpu(“NA”、“NA”、“NA”、“NA”))
返回cpuinfo
}
}
捕获(例外e){
println“getCpuInfo”+e
}
}
}
我认为您应该以如下方式重写WindowsHelper类的getCpuInfo()方法:
def getCpuInfo(List<cpu> cpuinfo)
{
try {
def cpusize=root.SYSTEM[0].children().size()
if (cpusize > 0) {
root.SYSTEM[0].children().each { node ->
if (node.name() ==~ /(?i)cpu\d+/) {
cpuinfo.add(new cpu(node.@BRAND, "NA", node.@SPEED, "NA"))
}
}
}
if (!cpuinfo) {
cpuinfo.add(new cpu("NA","NA","NA","NA"))
}
return cpuinfo
} catch(Exception e) {
println "getCpuInfo "+e
}
}
def getCpuInfo(列出cpuinfo)
{
试一试{
def cpusize=root.SYSTEM[0]。children().size()
如果(cpusize>0){
root.SYSTEM[0]。children()。每个{node->
如果(node.name()==~/(?i)cpu\d+/){
添加(新cpu(节点。@BRAND,“NA”,节点。@SPEED,“NA”))
}
}
}
如果(!cpuinfo){
添加(新cpu(“NA”、“NA”、“NA”、“NA”))
}
返回cpuinfo
}捕获(例外e){
println“getCpuInfo”+e
}
}
SYSTEM标记也将有其他子标记,我认为在这种情况下cpusize=root.SYSTEM.size()
将失败