как пройти внутри xml-узла и проверить значение атрибута?

#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 по ошибке был environment

5. Я думаю, проблема, должно быть, в том, что у вас есть OSinfo или osInfo или что-то еще, не osinfo как вы опубликовали здесь