arrays - bash 将 XML 解析为多维数组

标签 arrays xml linux bash parsing

我有一个 XML 文件,我想将其解析为 bash 变量/数组。 由于我正在使用 NAS 盒子,因此可用的 Linux 命令 (busybox) 有限。

我的 XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?> . 
<WEBCAMS>  
<CAM>  
            <DESCRIPTION>description for cam 1</DESCRIPTION>
            <URL>http://myURLtoWebcam1/cam1/pic.jpg</URL>
            <FILENAME>filename1</FILENAME>   
</CAM>  
<CAM>  
            <DESCRIPTION>description for cam 2</DESCRIPTION>
            <URL>http://myURLtoWebcam2/cam2/pic.jpg</URL>
            <FILENAME>filename2</FILENAME>   
</CAM>   
</WEBCAMS> 

到目前为止我的 bash 脚本:

#!/bin/sh
rdom () { local IFS=\> ; read -d \< E C ;}
while rdom; do
if [[ $E = DESCRIPTION ]]; then
        counter=$((counter+1))
        declare cam$counter="$C"
fi

done < webcams.xml

我想获取如下所示的 XML 内容:

echo "Cam1 description: ${cam1[0]}";  ## should show: description for cam 1
echo "Cam1 URL: ${cam1[1]}"; ## should show: http://myURLtoWebcam1/cam1/pic.jpg
echo "Cam1 filename: ${cam1[2]}"; should show: filename1

echo "Cam2 description: ${cam2[0]}"; ## should show: description for cam 2
echo "Cam2 URL: ${cam2[1]}"; ## should show: http://myURLtoWebcam1/cam2/pic.jpg
echo "Cam2 filename: ${cam2[2]}"; ## should show: filename2 

到目前为止,我只能将“DESCRIPTION”字段读入 bash 变量。
知道如何将其他字段“URL”和“FILENAME”放入我的数组/变量中吗?由于我的 NAS 上的 Linux 命令有限,目前找到的解决方案不适合或无法根据我的需求进行修改。

最佳答案

如果 XSLTPROC 可用,您就可以使用它 - 额外的好处是它是一个真正的 XML 解析器。

> xsltproc transform.xsl webcams.xml 

Cam1 description: description for cam 1
Cam1 URL: http://myURLtoWebcam1/cam1/pic.jpg
Cam1 filename: filename1
Cam2 description: description for cam 2
Cam2 URL: http://myURLtoWebcam2/cam2/pic.jpg
Cam2 filename: filename2

transform.xsl 在哪里

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="CAM">
  <xsl:variable name="i" select="position()" />
Cam<xsl:value-of select="$i"/> description: <xsl:value-of select="DESCRIPTION"/>
Cam<xsl:value-of select="$i"/> URL: <xsl:value-of select="URL"/>
Cam<xsl:value-of select="$i"/> filename: <xsl:value-of select="FILENAME"/>
  </xsl:template>


  <xsl:template match="/WEBCAMS"><xsl:apply-templates select="*"/>
  <xsl:text>
</xsl:text>
  </xsl:template>
</xsl:stylesheet>

关于arrays - bash 将 XML 解析为多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602902/

相关文章:

java - 文本到xml文件

java - ant build.xml 文件中的 jmockit 覆盖率报告步骤

linux - 安装陨石软件包时出错

ruby - 坚持环境变量

javascript - 我试图仅返回数组中包含具有真实值的匹配键的项目,其中该键来自单独的数组

python - 类型错误 : only size-1 arrays can be converted to Python scalars (matplotlib)

php - 关联数组 - 重复键值

android - 如何从拉动编辑自定义 xml 以刷新库?

c++ - Debian 上的 qt ./configure

c++ - "Empty"数组\vector 成员 C++