xmlstarlet Fritzbox FB 电话簿到 CSV
xmlstarlet Fritzbox FB phonebook to CSV
我正在尝试将从 FritzBox 下载的 XML 电话簿转换为 CSV 文件。
XML 中的联系人元素有一个真实姓名和一对多 telephony/number 元素。我只对属性为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
您可以使用谓词执行此操作(number[@type='work']
仅选择具有属性 type
且值为 work
的 number
个元素):
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 表达式更改为绝对路径,以使其更具描述性。当然,这不是强制性的。
我正在尝试将从 FritzBox 下载的 XML 电话簿转换为 CSV 文件。 XML 中的联系人元素有一个真实姓名和一对多 telephony/number 元素。我只对属性为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
您可以使用谓词执行此操作(number[@type='work']
仅选择具有属性 type
且值为 work
的 number
个元素):
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 表达式更改为绝对路径,以使其更具描述性。当然,这不是强制性的。