xmlstarlet Fritzbox XML 电话簿到 VCARD
xmlstarlet Fritzbox XML phonebook to VCARD
我正在尝试将 XML phone 一本书(Fritzbox 格式)转换为 VCARD 格式。
稍后我想使用 Winmerge 或 Meld 将创建的 vcard 文件与从其他来源导出的 vcard 合并。
Test.xml 一条记录没有 telephony/number[@type='home'] 元素:
<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>
</telephony>
<services/>
</contact>
</phonebook>
</phonebooks>
我可以使用 xmlstarlet 将其转换为 vcard:
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "begin:vcard" -n \
-v "concat('n:',person/realName)" -n \
-v "concat('tel;cell:',telephony/number[@type='work'])" -n \
-v "concat('tel;home:',telephony/number[@type='home'])" -n \
-o "end:vcard" -n \
-n test.xml
输出:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
tel;home:
end:vcard
这就是我想要的:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
end:vcard
问题是,如果不存在任何元素,我该如何抑制像 'tel;home:' 这样的 vcard 标签。
仔细研究后,我发现必须使用条件 (--if)。
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "BEGIN:VCARD" -n \
-o "VERSION:2.1" -n \
-v "concat('FN:',person/realName)" -n \
\
--if "telephony/number[@type='work'] != ''" \
-v "concat('TEL;WORK;VOICE:',telephony/number[@type='work'])" -n \
--break \
\
--if "telephony/number[@type='home'] != ''" \
-v "concat('TEL;HOME;VOICE:',telephony/number[@type='home'])" -n \
--break \
\
--if "telephony/number[@type='mobile'] != ''" \
-v "concat('TEL;CELL;VOICE:',telephony/number[@type='mobile'])" -n \
--break \
-o "END:VCARD" -n -n \
FB.xml
我正在尝试将 XML phone 一本书(Fritzbox 格式)转换为 VCARD 格式。 稍后我想使用 Winmerge 或 Meld 将创建的 vcard 文件与从其他来源导出的 vcard 合并。
Test.xml 一条记录没有 telephony/number[@type='home'] 元素:
<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>
</telephony>
<services/>
</contact>
</phonebook>
</phonebooks>
我可以使用 xmlstarlet 将其转换为 vcard:
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "begin:vcard" -n \
-v "concat('n:',person/realName)" -n \
-v "concat('tel;cell:',telephony/number[@type='work'])" -n \
-v "concat('tel;home:',telephony/number[@type='home'])" -n \
-o "end:vcard" -n \
-n test.xml
输出:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
tel;home:
end:vcard
这就是我想要的:
begin:vcard
n:Paul Tiger
tel;cell:071150885524
end:vcard
问题是,如果不存在任何元素,我该如何抑制像 'tel;home:' 这样的 vcard 标签。
仔细研究后,我发现必须使用条件 (--if)。
xmlstarlet \
sel -t -m /phonebooks/phonebook/contact \
-o "BEGIN:VCARD" -n \
-o "VERSION:2.1" -n \
-v "concat('FN:',person/realName)" -n \
\
--if "telephony/number[@type='work'] != ''" \
-v "concat('TEL;WORK;VOICE:',telephony/number[@type='work'])" -n \
--break \
\
--if "telephony/number[@type='home'] != ''" \
-v "concat('TEL;HOME;VOICE:',telephony/number[@type='home'])" -n \
--break \
\
--if "telephony/number[@type='mobile'] != ''" \
-v "concat('TEL;CELL;VOICE:',telephony/number[@type='mobile'])" -n \
--break \
-o "END:VCARD" -n -n \
FB.xml