使用XmlSlurper解析xml时如何忽略xsi:nil属性

时间:2014-05-16 22:31:33

标签: java groovy

我们正在升级使用XML内容的第三方产品。新版本生成具有xsi:nil="true"属性的XML,指示空元素:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <cusip  xsi:nil="true"/>
  <ticker xsi:nil="true"/>
  <year>2014</year>
</data>

解析时,我们使用:

def parsed = new XmlSlurper().parseText(xml)
...
element.attributes().each{ k,v -> {
}

.. xsi:nil="true"的属性键以:

返回

"{http://www.w3.org/2001/XMLSchema-instance}nil"

...这对我们的下游处理提高了地狱,因为它不期望用括号括起来的属性键。

XmlSlurper是否支持忽略xsi架构类型属性的方法,而无需手动过滤它们?

要清除

给出xml ...

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <cusip  xsi:nil="true"/>
  <ticker xsi:nil="true"/>
  <year format='yyyy'>2014</year>
</data>

...只有属性format可见;忽略xsi:nil个属性:

def parser1 = new XmlParser(false, false).parseText(xml)
assert parser1.children()*.attributes().size() == 1   // for 'format'

1 个答案:

答案 0 :(得分:1)

更新:

您可以将带有namespaceAware的XmlSlurper设置为false,如下所示:

def parsed = new XmlSlurper(false, false).parseText(xml)

如果可行,您也可以使用XmlParser进行解析,类似于XmlSlurper。您可以选择使用以下方法使解析器命名空间不知道:

def parsed = new XmlParser(false, false).parseText(xml)

将构造函数的第二个参数(namespaceAware)切换到true以查看差异。

示例:

def xml = '''<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <cusip  xsi:nil="true"/>
  <ticker xsi:nil="true"/>
  <year>2014</year>
</data>
'''

def parser1 = new XmlParser(false, false).parseText(xml)
def parser2 = new XmlParser(false, true).parseText(xml)

println parser1.children()*.attributes()
println parser2.children()*.attributes()