Groovy:解析XML并将属性值存储到变量中

时间:2015-07-22 09:39:16

标签: groovy

我必须读取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

有人可以帮助我吗?

2 个答案:

答案 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_idn_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()中看到它已经分解成的一些部分。

返回的dgroovy.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)

  • 使用&#34; @ attributename&#34;获取属性值
  • 使用&#34;元素&#34;要获取元素的名称。

以下是您的示例:

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)