xmlstarlet Телефонная книга Fritzbox FB в CSV

Я пытаюсь преобразовать телефонную книгу XML, загруженную из FritzBox, в файл CSV. Элемент контакта в XML имеет реальное имя и один ко многим элементам телефонии/номера. Меня интересуют только элементы с атрибутом работа и дом.

Полученный файл CSV должен иметь три столбца:

  • Col1 Значение элемента /contact/realName
  • Значение Col2 элемента /контакт/телефония/номер с атрибутом "работа"
  • Значение Col3 элемента /contact/telephony/number с атрибутом "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>

Мне удалось извлечь реальное имя и номер с помощью:

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

person Hanspeter    schedule 06.08.2018    source источник
comment
Пожалуйста, опишите вашу конкретную проблему. Мы понятия не имеем, что вы уже пробовали и где застряли.   -  person Filburt    schedule 06.08.2018


Ответы (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 на абсолютные пути, чтобы сделать их более наглядными. Конечно, это не обязательно.

person zx485    schedule 06.08.2018