xmlstarlet Fritzbox FB телефонная книга для CSV
Я пытаюсь преобразовать телефонную книгу XML, загруженную из FritzBox, в файл CSV. Элемент контакта в XML имеет realName и один ко многим элементам телефонии / номера. Меня интересуют только элементы с атрибутом работа и дом.
Полученный CSV-файл должен иметь три столбца:
- Col1 Значение элемента / contact / realName
- Col2 значение элемента / контакта / телефонии / номера, имеющего атрибут "работа"
- Col3 значение элемента / контакта / телефонии / номера, имеющего атрибут "home"
Пример XML с одним контактом:
<phonebooks>
<phonebook name="Telefonbuch">
<contact>
<category/>
<person>
<realName>Paul Tiger</realName>
</person>
<telephony nid="4">
<number type="work" id="1" vanity="" prio="1">071150885524</number>
<number type="home" prio="0" id="3">0151-19630027</number>
</telephony>
<services/>
</contact>
</phonebook>
</phonebooks>
Мне удалось извлечь realName и номер с помощью:
xmlstarlet sel -t -m //contact/* -v "concat(realName,';',number)" test.xml
;Paul Tiger;;071150885524;
Мне нужно что-то вроде "ЕСЛИ ТО" на выходе, чтобы экспортировать конкретное число на основе атрибута типа home или work .
Есть ли что-то вроде ЕСЛИ ТОГДА, как это.
xmlstarlet ...
-v "concat(
realName,';',
IF type="work" THEN number,';'
IF type="home" THEN number,';'
)" test.xml
1 ответ
Вы можете сделать это с помощью предикатов (number[@type='work']
выбирает только number
элементы, которые имеют атрибут type
со значением work
):
xmlstarlet sel -t -m /phonebooks/phonebook/contact -v "concat(person/realName,';',telephony/number[@type='work'],';',telephony/number[@type='home'])" test.xml
Выход:
Paul Tiger;071150885524;0151-19630027
Я также изменил ваши выражения XPath на абсолютные пути, чтобы сделать их более наглядными. Конечно, это не обязательно.