如何给动态xpaths使用Groovy XmlParser从xml获取数据?
问题描述:
我有这个xml我需要获取CPU的信息,但数字部分的标签CPU"1"
可能会改变。我怎么能给一个xpath,以便它动态地像数字部分一样,直到n
?如何给动态xpaths使用Groovy XmlParser从xml获取数据?
我的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.[email protected],"NA",[email protected],"NA"))
}
return cpuinfo
}
else{
cpuinfo.add(new cpu("NA","NA","NA","NA"))
return cpuinfo
}
}
catch(Exception e){
println "getCpuInfo "+e
}
}
}
答
我想你应该重写getCpuInfo() WindowsHelper类的方法如下:
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([email protected], "NA", [email protected], "NA"))
}
}
}
if (!cpuinfo) {
cpuinfo.add(new cpu("NA","NA","NA","NA"))
}
return cpuinfo
} catch(Exception e) {
println "getCpuInfo "+e
}
}
'SYSTEM'标签也会有其他子标签,我认为在这种情况下'cpusize = root.SYSTEM.size()'会失败 – abi1964
我稍微修改了代码以适应新的条件。 –