Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用相同元素标记但数据唯一的XML解析_Xml_Parsing_Grails_Groovy_Xmlslurper - Fatal编程技术网

使用相同元素标记但数据唯一的XML解析

使用相同元素标记但数据唯一的XML解析,xml,parsing,grails,groovy,xmlslurper,Xml,Parsing,Grails,Groovy,Xmlslurper,我正在解析具有许多相同标记的xml。在标记中有一个值的名称,然后是值。我的问题是我需要将这些值分开 这是我必须解析的xml的一个示例 <Event> <ipaddress> 10.0.0.0. </ip> <sourcesystem> somwhere </sourcesystem> <username> fred91 </username> <user&g

我正在解析具有许多相同标记的xml。在标记中有一个值的名称,然后是值。我的问题是我需要将这些值分开

这是我必须解析的xml的一个示例

  <Event>
  <ipaddress>
  10.0.0.0.
  </ip>

  <sourcesystem>
  somwhere
  </sourcesystem>
  <username>
   fred91
  </username>
   <user>
   <username>
  fred91
   </username>
   <account>
  fredsaccount
   </account>
   <id>
    f2234232
    </id>
   </user>
  ////BELOW IS THE PORTION OF THE XML THAT I AM HAVING ISSUES WITH NOTICE MULTPLE OF THE SAME ELEMENT TAG BUT THE name and values are unique/////
 <event-details>
   <name>Prairie Farms</name>
   <value>Summer Lane Happy Land USA</value>
 </event-details>  
 <event-details>
   <name>House on fire</name>
   <value>ashes</value>
 </event-details>
</Event>
审计是我的对象,解析是我的xmlslurper。 现在,这只是将所有“name”元素放入一个字符串中,并将所有这些元素对应的值(分别按顺序)放入另一个字符串中。 像这样:

名称:着火的草原农舍

价值:夏巷快乐乐园

我最终需要它

大草原农场:美国夏令营快乐乐园

着火的房子:灰烬

到目前为止,我知道大约有10个不同的唯一名称(通过查看此查询接收到的串在一起的名称发现)

我需要写些什么才能得到它,这样它就能挑选出唯一的事件名称并将其与它的值链接起来

parsing.'event-details'.each{
   if (parsing."event-details"."name".text().equals("createdTime")){
    audit.name = parsing."event-details"."name".text
    audit.createdTime = parsing."event-details"."value".text()
   }
}
^这是我的第一个想法,使用所有已知的唯一名称,并通过这种方式为值指定名称。这可能只是将createdTime与该值链接起来,并将其余部分作为测试忽略,但它甚至没有做到这一点

有什么建议或意见吗

抱歉,这让人困惑。我觉得有点难以解释


谢谢你抽出时间

唯一键将帮助您使用
map
,如下所示:

def audit = [:]
parsing.'event-details'.each{
      def name = parsing.event-details.name?.text() 
      def value = parsing.event-details.value?.text()

      //To make it easy to understand
      audit << [name: value]

      //I would have used
      audit << [(parsing.event-details.name?.text()): parsing.event-details.value?.text()]
}
def audit=[:]
正在分析“事件详细信息”。每个{
def name=parsing.event details.name?.text()
def value=parsing.event details.value?.text()
//使其易于理解

audit假设您使用的是XmlSlurper,请尝试:

def audit = parsing.'event-details'.iterator().collectEntries {
  [ it.name, it.value ]
}
编辑: 好的,考虑到xml:

def x = '''<Event>
          |  <ipaddress>10.0.0.0</ipaddress>
          |  <sourcesystem>somwhere</sourcesystem>
          |  <username>fred91</username>
          |  <user>
          |    <username>fred91</username>
          |    <account>fredsaccount</account>
          |    <id>f2234232</id>
          |  </user>
          |  <event-details>
          |    <name>Prairie Farms</name>
          |    <value>Summer Lane Happy Land USA</value>
          |  </event-details>  
          |  <event-details>
          |    <name>House on fire</name>
          |    <value>ashes</value>
          |  </event-details>
          |</Event>'''.stripMargin()
你可以做:

def audit = new XmlSlurper().parseText( x ).with { xml ->
  new Audit( ipAddress    : xml.ipaddress,
             sourceSystem : xml.sourcesystem,
             username     : xml.username,
             account      : xml.user.account,
             id           : xml.user.id,
             eventDetails : xml.'event-details'.iterator().collectEntries { [ it.name, it.value ] } )
}

println audit
要打印:

Audit(ipAddress:10.0.0.0, sourceSystem:somwhere, username:fred91, account:fredsaccount, id:f2234232, eventDetails:[Prairie Farms:Summer Lane Happy Land USA, House on fire:ashes])
注: 如果您使用的是Groovy<1.8.7,则更改

             eventDetails : xml.'event-details'.iterator().collectEntries { [ it.name, it.value ] } )


eventDetails:xml.'event-details'。注入([:]){m,e->m@dmahapatro哈哈,别担心;-)我想我是从这里的某个人那里学到的!@coffeedlerintern不知道你的意思……你能编辑这个问题,使它更像你遇到的问题吗?@coffeedlerinten你能让XML代表这个问题吗?这现在似乎是一个与以前完全不同的问题(但我猜是同一个,我只是没有掌握全貌)@CoffeedLettern有多个
块吗?我问你有
解析。“用户”。每个
@CoffeedLettern假设有,我已经更新了我的答案
Audit(ipAddress:10.0.0.0, sourceSystem:somwhere, username:fred91, account:fredsaccount, id:f2234232, eventDetails:[Prairie Farms:Summer Lane Happy Land USA, House on fire:ashes])
             eventDetails : xml.'event-details'.iterator().collectEntries { [ it.name, it.value ] } )
             eventDetails : xml.'event-details'.inject( [:] ) { m, e -> m << [ (e.name): e.value ] } )