首页 > 解决方案 > 使用 Shell 脚本将 XML 文件的标签存储在数组中

问题描述

我有一个格式为 XML 的文件:

<classes>

 <subject>
  <name>Operating System</name>
  <credit>3</credit>
  <type>Theory</type>
  <faculty>Prof. XYZ</faculty> 
 </subject>

 <subject>
  <name>Web Development</name>
  <credit>3</credit>
  <type>Lab</type>
 </subject>

</classes>

我想使用 Shell 脚本将标签名称(即名称、信用、类型、教师)存储在一个数组中。

我尝试使用awk命令:

awk -F'[<>]' '/<name>|<credit>|<type>|<faculty>/{print $2}' file.xml

但它的返回值如下:

name
credit
type
faculty
name
credit
type

如何将这些结果存储在数组中?

标签: xmlshellawk

解决方案


如果您控制 xml 的来源,我理解手动解析它的诱惑。但是这种方法有很多问题。使用 xml 库来解析 xml 会更安全。

这是一种使用 libxml 及其命令行界面 xsltproc 的方法:

xsltproc classes.xsl classes.xml

类.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="/classes/subject/*">
        <xsl:text>&#x09;</xsl:text>
        <xsl:value-of select="name(.)" /><xsl:text>:&#x09;</xsl:text>
        <xsl:value-of select="." /><xsl:text>&#x0a;</xsl:text>
    </xsl:template>

    <xsl:template match="/classes/subject/name">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="." />
        <xsl:text>':&#x0a;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

输入:

<?xml version="1.0"?>
<classes><subject><name>Operating System</name><credit>3</credit><type>Theory</type><faculty>Prof. XYZ</faculty></subject><subject><name>Web Development</name><credit>3</credit><type>Lab</type></subject></classes>

输出:

'Operating System':
    credit: 3
    type:   Theory
    faculty:    Prof. XYZ
'Web Development':
    credit: 3
    type:   Lab

当我对 xml 进行切片和切块时,有人花时间向我解释了这一点。现在我付钱了。


推荐阅读