我们正在升级使用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'
答案 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()