Windows脚本重新排序和替换XML文件中的文字?

时间:2018-09-20 21:14:11

标签: python xml batch-file

我发现了几个类似的问题,但没有一个完全达到我的目标,就是要在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="&amp;TV">&amp;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="&amp;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

1 个答案:

答案 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帮助文件,因为它更多 全面的学习。