特定の方法で.xmlファイルを解析します。

特定の方法で.xmlファイルを解析します。

次の.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改行文字を印刷させます。

答え2

使用xml2(および引用符をサポートするシェル$'...'):

{ echo "<r>"; cat file.xml; echo "</r>"; } |
  | xml2 | 2csv -d $'\t' ContactPerson GivenName FamilyName EmailList/Email

ContactPerson複数のメールアドレスがある場合は、最後のアドレスが返されます。)

答え3

この問題を処理するために2番目のファイルを使用することに同意する場合は、XSLTファイルを作成してそれを使用してXMLファイルを変換できますxsltproc

電話.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ContactPerson">
  <xsl:value-of select="GivenName"/><xsl:text> </xsl:text><xsl:value-of select="FamilyName"/>
  <xsl:for-each select="PhoneFixList/PhoneFix">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:for-each select="EmailList/Email">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

次にファイルを変換します(@ KusalanandaのXMLをとして使用phones.xml)。

$ xsltproc phones.xsl phones.xml
John Wayne 78787878 [email protected]
James Stewart 90909090 [email protected]

XSLTを使用すると、要素を反復処理して条件付き出力などを実行できるという利点があります。学習とプログラミングを喜んで行う場合は非常に強力です。

関連情報