如何使用XmlSlurper获取所有子标签作为列表

时间:2018-09-26 07:54:26

标签: xml groovy xmlslurper

我想从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

2 个答案:

答案 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']

希望有帮助。