次の.xmlがあり、特定の出力が必要です。
<ContactPerson>
<GivenName>John</GivenName>
<FamilyName>Wayne</FamilyName>
<PhoneFixList>
<PhoneFix>78787878</PhoneFix>
</PhoneFixList>
<EmailList>
<Email>[email protected]</Email>
</EmailList>
</ContactPerson>
<ContactPerson>
<GivenName>James</GivenName>
<FamilyName>Stewart</FamilyName>
<PhoneFixList>
<PhoneFix>90909090</PhoneFix>
</PhoneFixList>
<EmailList>
<Email>[email protected]</Email>
</EmailList>
</ContactPerson>
出力:
John Wayne 78787878 [email protected]
James Stewart 90909090 [email protected]
いくつかのケースでは、2つ以上を経験した<ContactPerson>
ので、このための良いループを持つことができてうれしいです。 forループを使用して問題を解決しようとしましたが、常に結果が得られました。
John Wayne 78787878 [email protected]
John Wayne 78787878 [email protected]
ベストアンサー1
次の(修正された)XMLを想定します。
<?xml version="1.0"?>
<root>
<ContactPerson>
<GivenName>John</GivenName>
<FamilyName>Wayne</FamilyName>
<PhoneFixList>
<PhoneFix>78787878</PhoneFix>
</PhoneFixList>
<EmailList>
<Email>[email protected]</Email>
</EmailList>
</ContactPerson>
<ContactPerson>
<GivenName>James</GivenName>
<FamilyName>Stewart</FamilyName>
<PhoneFixList>
<PhoneFix>90909090</PhoneFix>
</PhoneFixList>
<EmailList>
<Email>[email protected]</Email>
</EmailList>
</ContactPerson>
</root>
これXMLスター 移動する
xml sel -t -m '//ContactPerson' -v 'concat(GivenName, " ", FamilyName, " ", PhoneFixList/PhoneFix, " ", EmailList/Email)' -nl file.xml
生産する
John Wayne 78787878 [email protected]
James Stewart 90909090 [email protected]
XMLStarlet の呼び出しには、ContactPerson
すべてのノードの暗黙的なループが含まれており、各ノードに対して特定のフィールドがリンクされ、正しい出力が生成されます。最後に-nl
改行文字を印刷させます。