IT源码网

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

third_qq_acbf90bbd2dede1d 2024年02月25日 程序员 136 0

我有一个 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> 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!