首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmlstarlet Fritzbox FB电话簿到CSV

xmlstarlet Fritzbox FB电话簿到CSV
EN

Stack Overflow用户
提问于 2018-08-06 10:30:02
回答 1查看 169关注 0票数 1

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

生成的CSV文件应该有三列:

  • 元素/contact/realName的Col1值
  • 具有属性"work“的元素/联系人/电话/号码的Col2值
  • 具有属性"home“的元素/联系人/电话/号码的Col3值

只有一个联系人的XML示例:

代码语言:javascript
复制
<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和数字:

代码语言:javascript
复制
xmlstarlet  sel  -t -m  //contact/* -v "concat(realName,';',number)"   test.xml 
;Paul Tiger;;071150885524;

我需要类似于输出中的“如果那么”这样的东西来导出基于类型属性home或work的特定数字。

有没有像这样的东西。

代码语言:javascript
复制
xmlstarlet  ... 
-v "concat(
 realName,';',
 IF type="work" THEN number,';'
 IF type="home" THEN number,';'
)"   test.xml
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 15:19:47

您可以使用谓词(number[@type='work']只选择具有带有值work的属性typenumber元素):

代码语言:javascript
复制
xmlstarlet  sel -t -m  /phonebooks/phonebook/contact -v "concat(person/realName,';',telephony/number[@type='work'],';',telephony/number[@type='home'])" test.xml

输出是:

代码语言:javascript
复制
Paul Tiger;071150885524;0151-19630027

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51705586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档