Java 如何在使用XmlSlurper解析xml时忽略xsi:nil属性
我们正在升级使用XML内容的第三方产品。新版本生成的XML具有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
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()