#xml #groovy #xmlslurper
#xml #groovy #xmlslurper
Вопрос:
У меня есть этот xml, я взял его в xml, a GPathResult object
как я могу получить Microsoft(R) Windows(R) Server 2003 Enterprise x64 Edition
на основе проверки с field
значением как OS Name
с использованием groovy xml slurping
<client productname="abp">
<machine>
<env>
<variable name='ALLUSERSPROFILE' value='C:Documents and SettingsAll Users' />
<variable name='APPDATA' value='C:Documents and SettingsAdministratorApplication 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>
Вот код синтаксического анализа
def file = new File(filepath)
def gpathResult = new XmlSlurper().parse(file)
summary.productname=gpathResult.@product.text()
log.info gpathResult.system.osinfo.osinfo.@field.text()
System.out.println("HI 1" gpathResult.machine.environment.variable.@name.text());
System.out.println("HI 2" gpathResult.machine.osinfo.osinfo.@field.text());
if(gpathResult.machine.environment.variable.@name.text().equals("OS"))
{
summary.osname=gpathResult.machine.environment.variable.@value.text()
}
if(gpathResult.machine.environment.variable.@name.text().equals("COMPUTERNAME"))
{
summary.hostname=gpathResult.machine.environment.variable.@value.text()
}
Здесь 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
Комментарии:
1. У вас есть код, который вы использовали для преобразования xml в
gpathResult
переменную?2. @tim_yates: да, у меня есть, я опубликую это через минуту
3. Как
gpathResult
создается (XmlSlurper
и т.д.)…. это был мой вопрос…4. @tim : теперь проверьте, правильный ли путь к файлу, поскольку именно так я печатаю другие материалы на экране
5. @tim_yates: Я подумал, может быть, я смогу просмотреть все osinfo, а затем проверить наличие
field
имени, если оно присутствует, а затем распечатать этот конкретныйinformation
атрибут. Итак, как я могу проникнуть в этот osinfo и проверить атрибуты полей/
Ответ №1:
Странно … если я сделаю это (с Groovy 1.8)
def gpathResult = new XmlSlurper().parseText( $/<client productname="abp">
<machine>
<env>
<variable name='ALLUSERSPROFILE' value='C:Documents and SettingsAll Users' />
<variable name='APPDATA' value='C:Documents and SettingsAdministratorApplication 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>/$ )
println "HI 1 ${gpathResult.machine.env.variable.@name*.text()}"
println "HI 2 ${gpathResult.machine.osinfo.osinfo.@field*.text()}"
он выводит:
HI 1 [ALLUSERSPROFILE, APPDATA, OS, COMPUTERNAME]
HI 2 [OS Name, OS Version, OS Manufacturer, OS Configuration, OS Build Type]
Можете ли вы попробовать этот код (при условии, что вы используете 1.8, последнюю версию Groovy — если нет, вам нужно будет использовать """
вместо $/
для разделителей строк и избегать
символов)
[править] Вероятно, это просто потому, что вы используете gpathResult.machine.environment.variable
вместо gpathResult.machine.env.variable
чтобы пройти через env-узлы, вы бы сделали что-то вроде:
gpathResult.machine.env.variable.each { node ->
println "${node.@name.text()} contains ${node.@value.text()}"
}
Комментарии:
1. HI 1 печатает правильно, но HI 2 по-прежнему ничего не печатает, и в моей системе это
environment
вместоenv
. Также я использую groovy 1.8, у меня будет снимок через минуту, проверьте мой вопрос2. @Abhishek Должно быть, ты чего-то не договариваешь нам тогда. Поскольку XML и код не совпадают, я предполагаю, что что-то не так с любым из них, и вы размещаете здесь неверную информацию, чтобы мы могли вам помочь. Было ли это, когда вы выполняли точно приведенный выше код, для которого ничего не печатается
HI 2
?3. хорошо, просто скажите мне, как пройти через все элементы environment.variable, чтобы я мог попробовать что-то еще, может быть, это сработает
4. я скопировал вставленное вами
println
утверждение и здесь я опубликовал лишь часть xml, я не хочу раскрывать части xml, и имена узлов также различны, но я осторожен при редактировании, вот почему env по ошибке был environment5. Я думаю, проблема, должно быть, в том, что у вас есть
OSinfo
илиosInfo
или что-то еще, неosinfo
как вы опубликовали здесь