编辑多个XML文件中的多个XML节点



我有多个XML文件(60+),我需要编辑多个文本节点(我认为它被称为)。我熟悉Java, JavaScript, Python, JQuery, PHP, HTML。

我可以用什么语言来完成这个?

这是我目前的示例XML文档:

<?xml version="1.0" encoding="utf-8"?><bookstore>
    <book category="cooking">
        <title lang="en">Chinese</title>
        <author>chinese author</author>
        <year>2015</year>
        <price>fourth</price>
    </book>
    <book category="cooking">
        <title lang="en">All American</title>
        <author>American Author</author>
        <year>2015</year>
        <price>6.00</price>
    </book>
</bookstore>

例如,我想一次更改多个元素的作者和年份!

这是我的python代码,它将一次编辑一个节点。我需要一个循环之类的东西来一次编辑更多内容。

from xml.dom.minidom import parse
import os
# create a backup of original file
new_file_name = 'dom.xml'
old_file_name = new_file_name + "~"
os.rename(new_file_name, old_file_name)
# change text value of element
doc = parse(old_file_name)
node = doc.getElementsByTagName('author')
node[0].firstChild.nodeValue = 'new author'

# persist changes to new file
xml_file = open(new_file_name, "w")
doc.writexml(xml_file, encoding="utf-8")
xml_file.close()

任何帮助都将非常感激。这里是新手程序员!

谢谢!: D

创建函数:

def create_backup(new_file_name):
    """ create a backup of original file """
    old_file_name = new_file_name + "~"
    os.rename(new_file_name, old_file_name)
    return old_file_name
def change_author(doc, new_author)
    """ change text value of 'author' """
    node = doc.getElementsByTagName('author')
    node[0].firstChild.nodeValue = new_author
def save_changes(new_file_name, doc):
    """ persist changes to new file """
    xml_file = open(new_file_name, "w")
    doc.writexml(xml_file, encoding="utf-8")
    xml_file.close()

现在很容易创建一个循环:

file_names = ['dom.xml', ...]
for new_file_name in file_names:
    old_file_name = create_backup(new_file_name)
    doc = parse(old_file_name)
    change_author(doc, 'new author')
    save_changes(new_file_name, doc)

就我个人而言,我会使用shell脚本和XMLStarlet。

for f in *.xml; do
  xmlstarlet ed 
    -u '//author' -v 'new author' 
    <"$f" >"$f.new" && mv "$f.new" "$f"
done

如果您只想更改《All American》一书的作者,并更改同一本书的价格,则可以改为:

for f in *.xml; do
  xmlstarlet ed 
    -u '//book[title="All American"]/author' -v 'new author' 
    -u '//book[title="All American"]/price' -v 12.34 
    <"$f" >"$f.new" && mv "$f.new" "$f"
done

请注意,如果任何其他用户都可以写入您正在使用的目录,那么使用硬编码的临时文件名是一种不好的做法;如果是这种情况,使用mktemp来生成唯一的临时文件名会更合适。

最新更新