Несколько совпадений xml с одной строкой csv (xmlstarlet) - PullRequest
0 голосов
/ 14 ноября 2018

Пример XML:

<hosts>
    <host>
        <name>Server A</name>
        <status>0</status>
        <groups>
            <group>
                <name>Discovered hosts</name>
            </group>
        </groups>
        <interfaces>
            <interface>
                <ip>10.1.2.3</ip>
            </interface>
        </interfaces>
    </host>
    <host>
        <name>Server B</name>
        <status>0</status>
        <groups>
            <group>
                <name>Discovered hosts</name>
            </group>
        </groups>
        <interfaces>
            <interface>
                <ip>10.1.2.4</ip>
            </interface>
        </interfaces>
    </host>
</hosts>

Я пытаюсь экспортировать записи в файл CSV следующим образом:

Discovered hosts,Server A,10.1.2.3,0
Discovered hosts,Server B,10.1.2.4,0

с xmlstarlet, направляющими с:

Может быть несколько опций --match, --copy-of, --value-of и т.д. в один шаблон. Эффект от применения шаблонов командной строки может быть иллюстрируется следующим аналогом XSLT

xml sel -t -c "xpath0" -m "xpath1" -m "xpath2" -v "xpath3" \ -t -m "xpath4" -c "xpath5"

Но мой результат отличается от ожидаемого:

$ xmlstarlet sel -t \
-m "//host/groups/group/name" -v . -o "," \
-m "//host/name" -v . -o "," \
-m "//host/interfaces/interface/ip" -v . -o "," \
-m "//host/status" -v . -n sample.xml 
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0

Очевидно, что можно использовать grep как обходной путь (именно это я и сделал), но я хочу понять, как правильно его использовать и что послужило причиной этого неочевидного поведения.

1 Ответ

0 голосов
/ 14 ноября 2018

Вы неправильно используете опцию -m.

Опция -m - это xpath, из которого вы извлекаете значения (с опцией -v).

Итак, ваш запрос должен быть:

xmlstarlet sel -t -m "hosts/host" \
                  -v "groups/group/name" -o "," \
                  -v "name" -o "," \
                  -v "interfaces/interface/ip" -o "," \
                  -v "status" \
                  -n file

, где hosts/host - корень вашего поискового запроса.

...