我发现了几个类似的问题,但没有一个完全达到我的目标,就是要在xml文件中编辑多行。我的脚本知识充其量是非常基础的,所以请提供一些我的基本大脑会理解的细节
我正尝试将其转换
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel update="i" site="openwebif" site_id="1:0:1:D32E:836:2:11A0000:0:0:0:" xmltv_id="&TV">&TV</channel>
<channel update="i" site="openwebif" site_id="1:0:1:2F17:7EF:2:11A0000:0:0:0:" xmltv_id="4Music">4Music</channel>
<channel update="i" site="openwebif" site_id="1:0:1:5302:814:2:11A0000:0:0:0:" xmltv_id="4seven">4seven</channel>
进入此
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<!-- vermin --><channel id="&TV">1:0:1:D32E:836:2:11A0000:0:0:0:</channel><!-- VM -->
<!-- vermin --><channel id="4Music">1:0:1:2F17:7EF:2:11A0000:0:0:0:</channel><!-- VM -->
<!-- vermin --><channel id="4seven">1:0:1:5302:814:2:11A0000:0:0:0:</channel><!-- VM -->
我什至不知道哪种方法最有效?可以用python完成吗?批量吗?
TIA
答案 0 :(得分:1)
import re
# Open the xml file.
with open('test1.xml', encoding='utf-8') as r:
# Read the file contents whole.
content = r.read()
# Do replacements using regex.
content = re.sub(r'^\s*(<channel)\s+.*?\s+site_id="(.*?)"\s+xmltv_id="(.*?)">.*?(</channel>)',
r'<!-- vermin -->\1 id="\3">\2\4<!-- VM -->', content, 0, re.I + re.M)
# Open and write the changed xml file.
with open('test2.xml', 'w', encoding='utf-8') as w:
w.write(content)
使用Python 3是因为您在问题摘要中提到了Python。
这使用正则表达式来修改XML。 如果XML具有与发布的示例相同的合理常量结构, 那么这可能会达到您的目标。
读取 test1.xml
并使用进行修改
re.sub()
的正则表达式模式。
test2.xml
是已应用更改的XML文件。
两个文件都被视为utf-8
。
阅读有关re
模块的Python帮助文件。
使用的正则表达式的简要概述。
^
匹配行首。\s
匹配空白字符。*
匹配0个或多个以前的模式|字符。+
匹配1个或多个以前的字符| (.*?)
将任何字符捕获为一个不贪心的组。\1
是第一个替代组。 \2
是第二组... re.I
是不敏感标志。re.M
是多行标志,因此可以使用行锚^
和$
。建议您阅读Python帮助文件,因为它更多 全面的学习。