使用相同元素标记但数据唯一的XML解析
我正在解析具有许多相同标记的xml。在标记中有一个值的名称,然后是值。我的问题是我需要将这些值分开 这是我必须解析的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
<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 ] } )