我必须读取XML并将属性值存储到变量中。因为我是Groovy的新手,所以我很困难。到目前为止,这就是我所做的。
PS:这就是我在方法中所做的事情。
XmlParser parser = new XmlParser()
//def xmldata1 = parser.parse (new FileInputStream("c:\\temp\\create.xml"))
def xml = """<record_change>
<record_id>04707317-28e3-40cb-a227-15d2c91e08c2</record_id>
<incident number="201507-001" status="open"/>
</record_change>"""
def xmldata1 = parser.parseText(xml)
def n_id = xmldata1.record_id.?????
def n_number = ????? //expecting incident number
def m_status = ????? // expecting incident status
有人可以帮助我吗?
答案 0 :(得分:3)
简短回答如下:
Ctrl+k, Ctrl+O
请注意,这与Jayan的答案略有不同,因为将节点列表索引到单个节点。在您的情况下,def n_id = xmldata1.record_id[0].text()
def n_number = xmldata1.incident[0].@number
def m_status = xmldata1.incident[0].@status
不是问题,但您需要n_id
和n_number
的索引,否则它们就是列表。此外,如果您获得NodeList中有多个节点的数据,您将遇到问题。请参阅我的回答中的m_status
示例。
对于此类调查,您最好的选择是使用text()
,然后直接询问对象。
这是一个显示此操作的会话:
groovysh
现在我们有了解析的xml,它位于局部变量groovy:000> p = new XmlParser()
===> groovy.util.XmlParser@292ea3d5
groovy:000> xml = '<record_change><record_id>04707317-28e3-40cb-a227-15d2c91e08c2</record_id><incident number="201507-001" status="open"/></record_change>'
===> <record_change><record_id>04707317-28e3-40cb-a227-15d2c91e08c2</record_id><incident number="201507-001" status="open"/></record_change>
groovy:000> d = p.parseText(xml)
===> record_change[attributes={}; value=[record_id[attributes={}; value=[04707317-28e3-40cb-a227-15d2c91e08c2]], incident[attributes={number=201507-001, status=open}; value=[]]]]
中。你已经可以从toString()中看到它已经分解成的一些部分。
返回的d
是groovy.util.Node
:
d
groovy:000> d.getClass()
===> class groovy.util.Node
是groovy.util.NodeList
:
d.record_id
NodeList上有一个text()
方法,“返回当前节点及其所有子节点的文本表示。”现在应该响起铃声。最后一部分说“......及其所有子节点”。 Node上还有一个groovy:000> d.record_id.getClass()
===> class groovy.util.NodeList
方法,所以如果你想确定不要获得额外的子节点,那么索引NodeList:
text()
如果你有类似的话:
groovy:000> d.record_id[0].text()
===> 04707317-28e3-40cb-a227-15d2c91e08c2
然后在record_id上调用text()会给出:
<record_change>
<record_id>1111</record_id>
<record_id>2222</record_id>
</record_change>
这可能不是你想要的。如果您正在使用Node或NodeList,请务必小心。如果你知道列表中只有一个节点,那么你会没事的。
对于groovy:000> d.record_id.text()
===> 11112222
,你会发现它也是一个NodeList,但显然没有文本部分,只有属性,正如我们从它的toString()中看到的那样:
incident
groovy:000> d.incident
===> [incident[attributes={number=201507-001, status=open}; value=[]]]
方法返回text()
中的部分。但是这里我们有可以使用value=[]
语法访问的属性。首先,我们还可以使用函数attributes()
来查询它们的名称和值(它返回一个常规的Map)。这是Node上的函数,而不是NodeList,因此我们必须使用@attributeName
索引NodeList以从NodeList获取Node。因此我们有:
d.incident[0]
直接地,您可以获得如下属性:
groovy:000> d.incident[0].attributes()
===> [number:201507-001, status:open]
groovy:000> d.incident[0].attributes().keySet()
===> [number, status]
啊!我们在NodeList上调用了groovy:000> d.incident.@number
===> [201507-001]
,因此它返回一个值列表(在你的情况下是一个值,但如果你有更复杂的数据,它将是多个项目)。如果您希望单独使用各个值,请按以前的步骤索引NodeList的相应元素:
@number
因此请注意索引以获取单个Node元素。
最后,如果您在其中引用带有连字符的元素,则可以使用它周围的引号来获取值,例如: groovy:000> d.incident[0].@number
===> 201507-001
。
答案 1 :(得分:2)
以下是您的示例:
XmlParser parser = new XmlParser()
//def xmldata1 = parser.parse (new FileInputStream("c:\\temp\\create.xml"))
def xml = """<record_change>
<record_id>04707317-28e3-40cb-a227-15d2c91e08c2</record_id>
<incident number="201507-001" status="open"/>
</record_change>"""
def xmldata1 = parser.parseText(xml) ;
def n_id = xmldata1.record_id.text()
def n_number = xmldata1.'incident'.@number
def m_status = xmldata1.incident.@status
assert n_id == '04707317-28e3-40cb-a227-15d2c91e08c2'
println(n_number)
println(m_status)