我想从xml文件中读取所有变量名。但是,尽管我要使用某种列表,但我会将所有“名称”粘合在一起。我如何获得列表中的所有名称?
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().parse(new File("src/main/resources/index.xml"))
indexFile
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.VariableLength
.VariableColumn
.Name
答案 0 :(得分:1)
我认为查询的URL只有一个表。如果是这种情况,您可以像这样使用find
访问名称:
def names = new XmlSlurper().parseText(xml)
.'**'
.find { it?.URL == "Sachkontenstamm.csv" }.VariableLength.VariableColumn
.collect { it.Name }
// Result: [Ktonr, Text]
如果多次出现带有给定URL的表,并用findAll
粘贴:
names = new XmlSlurper().parseText(xml)
.'**'
.findAll { it?.URL == "Sachkontenstamm.csv" }
.collect { it.VariableLength.VariableColumn.collect { it.Name } }
// Result: [[Ktonr, Text]]
如果可以混合使用多个表的数据,则可以对结果应用flatten
:
names.flatten()
// Result: [Ktonr, Text]
答案 1 :(得分:0)
如果要正确提取VariableColumn.Name
,则需要收集VariableLength
的所有子节点。在上面的示例中,您显示了解析器将路径结果压扁到单个节点。您可以通过向collect
子级添加VariableLength
操作并提取您感兴趣的信息来解决此问题。考虑以下示例:
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']
希望有帮助。