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




