提取內容物的正確的方式從XML是一個活生生的XML解析器。XMLStarlet是onesuch。
注意,這需要你的數據是實際的XML,其現有的數據也並非沒有添加根元素。
xmlstarlet sel -t -m '//element' -v ./@attr1 -o '(' -v ./@attr3 -o ')' -n <<EOF
<root>
<element attr1="val11" attr2="val12" attr3="val13" />
<element attr1="val21" attr2="val22" attr3="val23" />
<element attr1="val31" attr2="val32" attr3="val33" />
</root>
EOF
爲了解釋這是如何工作:
-t
開始一個新的模板
-m //element
文檔名爲element
任何地方的元素相匹配。
-v ./@attr1
發射命名attr1
-o '('
發射字面(
作爲字符串
-v ./@attr3
的屬性的內容發出命名attr3
-o ')'
發射字面)
作爲字符串
-n
的屬性的內容發出字面換行
如果您希望能夠在沒有安裝XMLStarlet的計算機上運行此功能,您可以生成XSLT模板,並使用XSLTProc調用該模板,該模板已廣泛使用。
運行xmlstarlet sel -C -t -m '//element' -v ./@attr1 -o '(' -v ./@attr3 -o ')' -n
發出下面的XSLT文件:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="//element">
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="./@attr1"/>
</xsl:call-template>
<xsl:text>(</xsl:text>
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="./@attr3"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="value-of-template">
<xsl:param name="select"/>
<xsl:value-of select="$select"/>
<xsl:for-each select="exslt:node-set($select)[position()>1]">
<xsl:value-of select="' '"/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果您保存此爲myproc.xslt
,並運行xsltproc myproc.xslt - <input.xml
,你會得到標準輸出所需的輸出。
此XML似乎無效。 – yanana