다음 .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>
</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를 사용하면 요소를 반복하고 조건부 출력 등을 수행할 수 있다는 장점이 있습니다. 학습과 프로그래밍을 기꺼이 수행하려는 경우 매우 강력합니다.