1

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

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

  • Col1 元素的值 /contact/realName
  • 具有属性“work”的元素/contact/telephony/number 的 Col2 值
  • 具有属性“home”的元素 /contact/telephony/number 的 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”之类的东西来根据类型属性 home 或 work 导出特定的数字。

有没有像这样的 IF THEN 之类的东西。

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

1 回答 1

1

您可以使用谓词来执行此操作(number[@type='work']仅选择具有valuenumber属性的元素):typework

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 表达式更改为绝对路径,以使它们更具描述性。当然,这不是强制性的。

于 2018-08-06T15:19:47.533 回答