【问题标题】:Add xml element in a xml file using shell script使用 shell 脚本在 xml 文件中添加 xml 元素
【发布时间】:2017-01-09 09:42:55
【问题描述】:

我有一个需要添加数据的 xml 文件,我尝试使用 sed。谁能帮我找出我做错的地方。

我有一个这样的 xml 文件:

<!DOCTYPE sf-migration
PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN"
"/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd">
<sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0">
<users></users>
</sf-migration>

现在我需要在用户中添加以下文件:

<sfuser xid="user1000">
           <username>beq03838</username>
           <email>noreply@nxp.com</email>
           <alternateEmail1></alternateEmail1>
           <dateCreated>2016-12-20 14:02:23 CET</dateCreated>
           <dateLastModified>2016-12-20 14:02:23 CET</dateLastModified>
           <detail></detail>
           <monitoringPreference>email</monitoringPreference>
           <lastLogin></lastLogin>
      </sfuser>

我的输出应该如下:

enter <!DOCTYPE sf-migration
PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN"
"/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd">
<sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0">
<users>
<sfuser xid="user1000">
<username>beq03838</username>
<email>noreply@nxp.com</email>
<alternateEmail1></alternateEmail1>
<dateCreated>2016-12-20 14:02:23 CET</dateCreated>
<dateLastModified>2016-12-20 14:02:23 CET</dateLastModified>
<lastLogin></lastLogin>
</sfuser>
</users>
</sf-migration>

我使用下面的 shell 脚本来附加文本:

CONTENT=give the suer content
C=$(echo $CONTENT | sed 's/\//\\\//g')
sed "/<\/users>/ s/.*/${C}\n&/" /tmptest/user1.xml

我做错了什么?有没有其他简单的方法可以在 xml 中添加元素? 我需要在 shell 中完成此操作,因为我的完整代码在 shell 中

【问题讨论】:

  • 您遇到的错误是什么?并且是否打算将“输入”作为输出中的第一个单词?

标签: xml shell xml-parsing


【解决方案1】:

处理多个文件并在命令行上转义是超级容易出错和hacky。您可以使用大多数语言的非常小的脚本来实现相同的目的。这是 Python 2 中的一个示例:

template = open("user.xml").read()
snippet = open("user_data.xml").read()
result = template.replace("</users>", snippet + "</users>")
open("user.xml", "w").write(result)

输出:

<!DOCTYPE sf-migration PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN" "/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd"> <sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0">
<users>
    <sfuser xid="user1000">
           <username>beq03838</username>
           <email>noreply@nxp.com</email>
           <alternateEmail1></alternateEmail1>
           <dateCreated>2016-12-20 14:02:23 CET</dateCreated>
           <dateLastModified>2016-12-20 14:02:23 CET</dateLastModified>
           <detail></detail>
           <monitoringPreference>email</monitoringPreference>
           <lastLogin></lastLogin>
    </sfuser> 
</users>

如果您需要更频繁地执行此操作,请使用此脚本:

#!/usr/bin/python

import sys
if len(sys.argv) != 4:
  print "This script prepends the given pattern in a template with a snippet. Both snippet and template are files."
  print "Usage:"
  print sys.argv[0] + " template snippet replacementpattern"
  sys.exit(1)

template = open(sys.argv[1]).read()
snippet = open(sys.argv[2]).read()
pattern = sys.argv[3]

if not pattern in template:
  print "Template doesn't contain the pattern."
  sys.exit(2)

print template.replace(pattern, snippet + pattern)

用法:

./prepend.py template.xml snippet.xml "</users>"

【讨论】:

  • 谢谢,。但在仅打印输出的第一个选项中。但我需要将结果的输出保存在源文件(模板)中
  • 将输出重定向到文件或使用 Python:open("template.xml", "w").write(result)
  • 你能给我格式吗? #!/usr/bin/python template = open("user.xml",'rw').read() sn-p = open("user_data.xml").read() print template.replace(" users>", sn-p + "") 它应该将输出保存回“user.xml”,其中包含 print 提供的所需输出