특정 방식으로 .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]

어떤 경우에는 두 개 이상을 경험했기 <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

이 문제를 처리하기 위해 두 번째 파일을 사용하는 데 동의하는 경우 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를 사용하면 요소를 반복하고 조건부 출력 등을 수행할 수 있다는 장점이 있습니다. 학습과 프로그래밍을 기꺼이 수행하려는 경우 매우 강력합니다.

관련 정보