我正在解析具有许多相同标签的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> 

请注意,事件的名称发生了变化,并且没有关联。如果它们是相关的,则将更易于解析。名称是事件的名称,并且是唯一的。该值链接到该唯一名称。我的问题是试图弄清楚如何从通用元素标记中解析出唯一名称,然后为该名称分配相应的值。有人告诉我尝试使用集合,但是我不确定该如何去做。现在,我有这样解析。
sql.query(myQuery, []) { ResultSet rs -> 
            while (rs.next()) {  
 
                  def parsing = new XmlSlurper().parseText(auditDetails) 
 
                        def audit = new Audit() 
 
                        audit.ipAddress = parsing."ip-address".text() 
                        audit.sourceSystem = parsing."source-system".text() 
                        audit.username = parsing."username".text() 
 
 
 
                        parsing."user".each{ 
                            audit.username = parsing."user"."username".text() 
                            audit.account = parsing."user"."account".text() 
                            audit.id= parsing."user"."id".text() 
                        } 
 
 
                            /*if (parsing."event-details"."name".text().equals("createdTime")){ 
                                audit.name = parsing."event-details"."name".text 
                                audit.createdTime = parsing."event-details"."value".text() 
                            }*/ 
                            audit.name = parsing."event-details".name?.text() 
                            audit.value = parsing."event-details".value?.text() 
                        audit.eventDetails = parsing."event-details".text() 

审计是我的目标,而解析是我的xmlslurper。
现在,这只是给我所有“名称”元素到一个字符串中,而所有相应的(分别按顺序)值放在另一个字符串中。
像这样:

名称:大草原上的农舍

值:夏天巷快乐地美国ashash

我最终需要像

草原农场:夏巷快乐大地美国

着火屋: Ember

到目前为止,我有大约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与该值链接,然后忽略其余的作为测试,但它甚至还没有达到目的。

有什么建议或意见吗?

抱歉,这令人困惑。我觉得很难解释

感谢您的时间!

请您参考如下方法:

假设您正在使用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() 

和审计类:
@groovy.transform.ToString(includeNames=true) 
class Audit { 
  String ipAddress, sourceSystem, username, account, id 
  Map eventDetails 
} 

你可以做:
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'.inject( [:] ) { m, e -> m << [ (e.name): e.value ] } ) 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!