在格式错误的xml中转义多余的引号

时间:2019-04-02 09:27:02

标签: python xml python-3.x

我的xml文件格式错误,在标签中包含多余的引号。我想将其删除或替换为“”。 格式错误的XML看起来像:

<CLASS ATT2="PDX"R"088">

我的预期结果:

<CLASS ATT2="PDX R 088">
or
<CLASS ATT2="PDX&quot;R&quot;088">

我尝试遍历所有行并找到ATT的第一和最后一个索引,但是它很脏,会产生太多代码。

有人对此有简单的解决方案吗?

2 个答案:

答案 0 :(得分:1)

这不是百分百的万无一失,但可能有些运气:

re.sub(r'(?<!=)"(?!>)', '&quot;', malformed_xml)

将仅替换既不加=也不加>的引号。

如果在=之后(或>之前)可以有空格,则不能再使用re模块,但是regex module (PyPI)可以这样:

regex.sub(r'(?<!=\s*)"(?!\s*>)', '&quot;', malformed_xml)

答案 1 :(得分:0)

也许不是最好的解决方案,但是由于您无法使用xml.etree解析它,因为它无效,因此您可以尝试使用下面的代码。

它将:

  1. 打开文件
  2. 逐行阅读
  3. 搜索是否有特定字符串(例如CLASS)的每一行
  4. 如果找到CLASS,请查找所有出现的双引号("
  5. 检查是否找到两个以上的双引号并将其替换为空白
  6. 更新行

警告:请备份原始文件,因为这会对其进行修改!!!

import re

f = open(r'YOUR/FILE/HERE',"r+b")
lines = f.readlines()
for idx, row in enumerate(lines):
     if "CLASS" in row:
         quote_index = [x.start() for x in re.finditer('\"', row)]
         if len(quote_index) > 2:
             replace_quote = quote_index[1:-1]
             correct_row = list(row)
             for quotes in replace_quote:
                 correct_row[quotes] = " "
             new_row = "".join(correct_row)
             lines[idx] = new_row
f.seek(0)
f.truncate()
f.write(''.join(lines))
f.close()