xmlstarlet Fritzbox FB电话簿转CSV

时间:2018-08-06 10:30:03

标签: xml xmlstarlet fritzbox

我正在尝试将从FritzBox下载的XML电话簿转换为CSV文件。 XML中的contact元素具有一个realName和一对多的电话/号码元素。我只对具有work和home属性的元素感兴趣。

生成的CSV文件应包含三列:

  • Col1元素/ contact / realName的值
  • / contact / telephony / number元素具有属性“ work”的Col2值
  • 具有属性“ home”的元素/ contact /电话/号码的Col3值

具有一个联系人的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;

我需要在输出中添加诸如“ IF THEN”之类的内容,以基于type属性home或work导出特定的数字。

是否有类似IF THEN之类的东西?

xmlstarlet  ... 
-v "concat(
 realName,';',
 IF type="work" THEN number,';'
 IF type="home" THEN number,';'
)"   test.xml

1 个答案:

答案 0 :(得分:1)

您可以使用谓词({number[@type='work']仅选择具有属性number且值为type的{​​{1}}个元素):

work

输出为:

xmlstarlet  sel -t -m  /phonebooks/phonebook/contact -v "concat(person/realName,';',telephony/number[@type='work'],';',telephony/number[@type='home'])" test.xml

我还将您的XPath表达式更改为绝对路径,以使其更具描述性。当然,这不是强制性的。