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

Java 如何在使用XmlSlurper解析xml时忽略xsi:nil属性,java,groovy,Java,Groovy,我们正在升级使用XML内容的第三方产品。新版本生成的XML具有xsi:nil=“true”属性,指示空元素: <?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>201

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

<?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>
…但是
xsi:nil=“true”
的属性键返回为:

”{http://www.w3.org/2001/XMLSchema-instance}无“

…这会让我们的下游处理陷入困境,因为它不需要大括号中包含的属性键

XmlSlurper是否支持忽略
xsi
schema类型属性而不必手动筛选它们的方法

要清楚

考虑到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>
更新:

您可以使用namespaceAware设置为false的XmlSlurper,如下所示:

def parsed = new XmlSlurper(false, false).parseText(xml)
如果可行,您还可以使用类似于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()
defxml=''
2014
'''
def parser1=新的XmlParser(false,false).parseText(xml)
def parser2=新的XmlParser(false,true)。parseText(xml)
println parser1.children()*.attributes()
println parser2.children()*.attributes()

但是XmlSlurper与NamespaceUnknowledge参数有类似的构造函数,有什么区别?没有区别,您也可以使用它。相应地更新。它不会禁用属性,但会抑制对名称空间的求值。@raffian精确测试对我来说很好。你的测试有3个属性;我只想看到在忽略xsi:nils时返回1。
def parsed = new XmlParser(false, false).parseText(xml)
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()