Я хочу прочитать все имена переменных из файла 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
1
KIC 26 Сен 2018 в 10:54

2 ответа

Лучший ответ

Если вы хотите правильно извлечь 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']

Надеюсь, это поможет.

0
Szymon Stepniak 26 Сен 2018 в 13:24

Я так понимаю, что для запрашиваемого 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
chriopp 26 Сен 2018 в 13:57