如何使用 XmlSlurper 将所有子标签作为列表获取
How to get all the sub tags as list using XmlSlurper
我想从 xml 文件中读取所有变量名。然而,虽然我会期望某种列表,但我将所有 "Names" 粘在一起。我如何获得列表中的所有名称?
Xml:
<DataSet>
<Version>1.0</Version>
<DataSupplier>
</DataSupplier>
<Media>
<Name />
<Table>
<URL>Sachkontenstamm.csv</URL>
<Name>Sachkontenplan</Name>
<DecimalSymbol>,</DecimalSymbol>
<DigitGroupingSymbol />
<VariableLength>
<VariableColumn>
<Name>Ktonr</Name>
<Description>Kontonummer des Kontos</Description>
<Numeric />
</VariableColumn>
<VariableColumn>
<Name>Text</Name>
<Description>Beschriftung</Description>
<AlphaNumeric />
<MaxLength>40</MaxLength>
</VariableColumn>
...
</VariableLength>
</Table>
</Media>
</DataSet>
groovy:
def indexFile = new XmlSlurper().parse(new File("src/main/resources/index.xml"))
indexFile
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.VariableLength
.VariableColumn
.Name
如果要正确提取 VariableColumn.Name
,您需要收集 VariableLength
的所有 children 个节点。在示例中,您已经在上面显示了解析器将路径结果压缩到单个节点。您可以通过将 collect
操作添加到 VariableLength
children 并提取您感兴趣的信息来修复它。考虑以下示例:
def xml = '''<DataSet>
<Version>1.0</Version>
<DataSupplier>
</DataSupplier>
<Media>
<Name />
<Table>
<URL>Sachkontenstamm.csv</URL>
<Name>Sachkontenplan</Name>
<DecimalSymbol>,</DecimalSymbol>
<DigitGroupingSymbol />
<VariableLength>
<VariableColumn>
<Name>Ktonr</Name>
<Description>Kontonummer des Kontos</Description>
<Numeric />
</VariableColumn>
<VariableColumn>
<Name>Text</Name>
<Description>Beschriftung</Description>
<AlphaNumeric />
<MaxLength>40</MaxLength>
</VariableColumn>
</VariableLength>
</Table>
</Media>
</DataSet>
'''
def indexFile = new XmlSlurper().parseText(xml)
def result = indexFile.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.collect { it.VariableLength.'*'.findAll { node -> node.name() == 'VariableColumn' }*.Name*.text() }
.flatten()
assert result == ['Ktonr', 'Text']
希望对您有所帮助。
我认为查询的URL只有一个table。如果是这种情况,您可以使用 find
访问名称,如下所示:
def names = new XmlSlurper().parseText(xml)
.'**'
.find { it?.URL == "Sachkontenstamm.csv" }.VariableLength.VariableColumn
.collect { it.Name }
// Result: [Ktonr, Text]
如果 table 与给定的 URL 多次出现,请坚持使用 findAll
:
names = new XmlSlurper().parseText(xml)
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.collect { it.VariableLength.VariableColumn.collect { it.Name } }
// Result: [[Ktonr, Text]]
如果多个 table 的数据可以混淆,您可以对结果应用 flatten
:
names.flatten()
// Result: [Ktonr, Text]
我想从 xml 文件中读取所有变量名。然而,虽然我会期望某种列表,但我将所有 "Names" 粘在一起。我如何获得列表中的所有名称?
Xml:
<DataSet>
<Version>1.0</Version>
<DataSupplier>
</DataSupplier>
<Media>
<Name />
<Table>
<URL>Sachkontenstamm.csv</URL>
<Name>Sachkontenplan</Name>
<DecimalSymbol>,</DecimalSymbol>
<DigitGroupingSymbol />
<VariableLength>
<VariableColumn>
<Name>Ktonr</Name>
<Description>Kontonummer des Kontos</Description>
<Numeric />
</VariableColumn>
<VariableColumn>
<Name>Text</Name>
<Description>Beschriftung</Description>
<AlphaNumeric />
<MaxLength>40</MaxLength>
</VariableColumn>
...
</VariableLength>
</Table>
</Media>
</DataSet>
groovy:
def indexFile = new XmlSlurper().parse(new File("src/main/resources/index.xml"))
indexFile
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.VariableLength
.VariableColumn
.Name
如果要正确提取 VariableColumn.Name
,您需要收集 VariableLength
的所有 children 个节点。在示例中,您已经在上面显示了解析器将路径结果压缩到单个节点。您可以通过将 collect
操作添加到 VariableLength
children 并提取您感兴趣的信息来修复它。考虑以下示例:
def xml = '''<DataSet>
<Version>1.0</Version>
<DataSupplier>
</DataSupplier>
<Media>
<Name />
<Table>
<URL>Sachkontenstamm.csv</URL>
<Name>Sachkontenplan</Name>
<DecimalSymbol>,</DecimalSymbol>
<DigitGroupingSymbol />
<VariableLength>
<VariableColumn>
<Name>Ktonr</Name>
<Description>Kontonummer des Kontos</Description>
<Numeric />
</VariableColumn>
<VariableColumn>
<Name>Text</Name>
<Description>Beschriftung</Description>
<AlphaNumeric />
<MaxLength>40</MaxLength>
</VariableColumn>
</VariableLength>
</Table>
</Media>
</DataSet>
'''
def indexFile = new XmlSlurper().parseText(xml)
def result = indexFile.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.collect { it.VariableLength.'*'.findAll { node -> node.name() == 'VariableColumn' }*.Name*.text() }
.flatten()
assert result == ['Ktonr', 'Text']
希望对您有所帮助。
我认为查询的URL只有一个table。如果是这种情况,您可以使用 find
访问名称,如下所示:
def names = new XmlSlurper().parseText(xml)
.'**'
.find { it?.URL == "Sachkontenstamm.csv" }.VariableLength.VariableColumn
.collect { it.Name }
// Result: [Ktonr, Text]
如果 table 与给定的 URL 多次出现,请坚持使用 findAll
:
names = new XmlSlurper().parseText(xml)
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.collect { it.VariableLength.VariableColumn.collect { it.Name } }
// Result: [[Ktonr, Text]]
如果多个 table 的数据可以混淆,您可以对结果应用 flatten
:
names.flatten()
// Result: [Ktonr, Text]