【问题标题】:Adding a XML element using shell or Python使用 shell 或 Python 添加 XML 元素
【发布时间】:2019-06-19 20:04:24
【问题描述】:

我们需要在多个位置插入 XML 元素

我必须再插入一个元素

<wtc-import>
      <name>WTCImportedService-0-rap01</name>
      <resource-name>XXXX01F</resource-name>
      <local-access-point>lap01</local-access-point>
      <remote-access-point-list>rap01</remote-access-point-list>
      <remote-name>XXXX01F</remote-name>
    </wtc-import>

在 ---INSERT WTC IMPORT SERVICE---- 下面文件中提到的位置

基本上在每个标签结束之前

  <wtc-server>
    <name>WTC-server-117-02</name>
    <target>cwea_117_02</target>
    <wtc-local-tux-dom>
      <name>lap01</name>
      <access-point>lap01</access-point>
      <access-point-id>wl.prodcwe117.02</access-point-id>
      <block-time>600</block-time>
      <nw-addr>//localhost:7125</nw-addr>
    </wtc-local-tux-dom>
    <wtc-remote-tux-dom>
      <name>rap01</name>
      <access-point>rap01</access-point>
      <access-point-id>tx.hello101</access-point-id>
      <local-access-point>lap01</local-access-point>
      <nw-addr>//hostanme:71105</nw-addr>
      <federation-url></federation-url>
      <federation-name></federation-name>
    </wtc-remote-tux-dom>
    <wtc-import>
      <name>WTCImportedService-0-rap01</name>
      <resource-name>XXXX01F</resource-name>
      <local-access-point>lap01</local-access-point>
      <remote-access-point-list>rap01</remote-access-point-list>
      <remote-name>XXXX01F</remote-name>
    </wtc-import>

--------在此处插入新的 WTC 导入---------

  </wtc-server>

  <wtc-server>
    <name>WTC-server-117-03</name>
    <target>cwea_117_03</target>
    <wtc-local-tux-dom>
      <name>lap01</name>
      <access-point>lap01</access-point>
      <access-point-id>wl.prodcwe117.02</access-point-id>
      <block-time>600</block-time>
      <nw-addr>//localhost:7125</nw-addr>
    </wtc-local-tux-dom>
    <wtc-remote-tux-dom>
      <name>rap01</name>
      <access-point>rap01</access-point>
      <access-point-id>tx.hello101</access-point-id>
      <local-access-point>lap01</local-access-point>
      <nw-addr>//hostanme:71105</nw-addr>
      <federation-url></federation-url>
      <federation-name></federation-name>
    </wtc-remote-tux-dom>
    <wtc-import>
      <name>WTCImportedService-0-rap01</name>
      <resource-name>XXXX01F</resource-name>
      <local-access-point>lap01</local-access-point>
      <remote-access-point-list>rap01</remote-access-point-list>
      <remote-name>XXXX01F</remote-name>
    </wtc-import>

--------在此处插入新的 WTC 导入---------

 </wtc-server>

请帮忙

【问题讨论】:

  • 呃,shell/Python?这就像说“我有一个十字头螺丝,想知道如何使用生锈的鱼钩或螺丝刀将其嵌入木板中”。您可以在 shell 中执行此操作,但要做得好(阅读:以一种适用于您的 XML 输入可以采用的所有可能形式并保证有效 XML 输出的方式)需要为翻译构建一个 XSLT 模板并调用xsltproc,或者使用像XMLStarlet 这样的工具,它们可以有效地将漂亮的前端放在构建XSLT 模板的工作上。在 Python 中实现它要好得多。
  • 顺便说一句,* 中的“sn-p”功能基本上等同于 JSFiddle;它仅适用于可以在浏览器中运行的代码。对于您希望将文字代码放在问题中的所有其他情况,请使用 {} 按钮(或四个空格缩进或三引号段)。
  • 当然@CharlesDuffy 感谢您的意见
  • 顺便说一句,它有助于确保您的代码足够完整,可以进行测试。这意味着包括一个根元素,以及可能位于文件顶部的任何 xmlns 定义。

标签: python xml shell awk sed


【解决方案1】:

使用 XMLStarlet 在 shell 中执行此操作如下所示:

xmlstarlet ed \
  --subnode '//wtc-server' -t elem -n wtc-import \
  --subnode '//wtc-server/wtc-import[last()]' -t elem -n name -v WTCImportedService-0-rap01 \
  --subnode '//wtc-server/wtc-import[last()]' -t elem -n resource-name -v XXXX01F \
  --subnode '//wtc-server/wtc-import[last()]' -t elem -n local-access-point -v lap01 \
  --subnode '//wtc-server/wtc-import[last()]' -t elem -n remote-access-point-list -v rap01 \
  --subnode '//wtc-server/wtc-import[last()]' -t elem -n remote-name -v XXXX01F \
  <in.xml >out.xml

(测试的代码没有任何xmlns 定义,因为问题的原始版本不包含任何定义)。

【讨论】: