我已经尝试搜索和阅读 xmlstarlet 帮助,如果我错过了答案,我深表歉意。我正在尝试使用现有的 XML 行并将其添加到使用 xmlstarlet 的 xml 文件中。 IE:

我有这样一行:<somedata name="aname" val="aval"/>
和一个类似于的xml文件

<xml>
  <subxml/>
</xml>

我希望输出是
<xml>
  <subxml>
    <somedata name="aname" val="aval"/>
  </subxml>
</xml>

我一直无法找到一种方法来回显我拥有的行并插入它或其他一些方法而不必解析该行然后插入使用的所有 xmlstarlet 编辑选项(-n -v ...)。

先谢谢您的帮助!

最佳答案

这是另一种解决方法,
使用 xmlstarlet 插入原始 XML 代码

  • 插入一个带有 xmlstarlet 的临时 xml 节点
  • 用 sed
  • 替换该节点

    临时节点在文件中必须是唯一的
    f=foo.xml
    xpath="/xml/subxml"
    raw_xml='<foo type="asdf">pipe||||amp&&&&back\0\1\2\3</foo>'
    
    raw_xml=$(echo "$raw_xml" \
    | sed 's,|,\\|,g' \
    | sed 's,&,\\\&,g' \
    | sed 's,\(\\[0-9]\),\\\1,g' \
    | sed ':a;N;$!ba;s,\n,\\n,g')
    temp=node$(date | md5sum | cut -d' ' -f1)
    xmlstarlet ed -L -s "$xpath" -t elem -n $temp "$f"
    sed -i "s|<$temp/>|$raw_xml|" "$f"
    

    例如,
    这将使用临时节点


    要使 sed 替换字符串起作用,我们必须
  • 替换 |用\|
  • 用\& 替换 &
  • 用\\0\\1\\2\\3 等替换\0\1\2\3 等。
  • 用\\n 替换\n

  • ps,stackoverflow 错误?
    在代码区之外,
    我必须写三个或四个反斜杠才能看到两个反斜杠 0__o

    关于xml - 如何使用 xmlstarlet 插入现有的 xml 行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28660018/

    10-11 18:50