python - 使用数字作为标签名称来解析损坏的 XML

标签 python regex xml string xml-parsing

我有很多 xml 文件,它们的键都是数字格式的,即 <12345>Golly</12345>

使用ElementTree解析时我收到错误 not well-formed (invalid token) 。我假设这是因为 key 是数字格式而不是单词。当我尝试通过使用正则表达式添加双引号来将键更改/替换为字符串时

xmlstr = re.sub('<([\d]+)>','<"' + str(re.search('<([\d]+)>', xmlstr).group(1))+ '">',xmlstr)
xmlstr = re.sub('</([\d]+)>','</"' + str(re.search('</([\d]+)>', xmlstr).group(1))+ '">',xmlstr)

所有其他键都使用第一个找到的键替换。(所有键最终都是相同的。而原始文件中的键本身在每个文档中都是唯一的。)我猜这些文件是直接从 json 转换为 xml 的。键应代表 ID 号,值是与 ID 号关联的名称

我想知道是否有一种方法可以使用数字作为键,或者是否有一种方法可以一个一个地替换键而不是用一个找到的字符串替换所有匹配项。 .group(1)返回导致问题的第一个事件。 请帮忙。

最佳答案

我认为您需要同时拥有数字标签名称和在不同保存组中捕获的内容,然后在替换字符串中引用它们:

In [2]: data = "<content><12345>Golly</12345><67890>Jelly</67890></content>"

In [3]: re.sub(r"<(\d+)>(.*?)</\d+>", r'<item id="\1">\2</item>', data)
Out[3]: '<content><item id="12345">Golly</item><item id="67890">Jelly</item></content>'

但是,如果无法访问输入 XML 数据的可能变化,就很难得出 100% 可靠的结果。例如,我不确定这个表达式是否能很好地处理嵌套的数字标签。

您可能还想探索解析lxml's "recovery" mode中的文档的可能性。 。

<小时/>

另一个可能有助于处理这种情况的工具是 BeautifulSoup - 您可以尝试非传统方法 - 使用宽松解析 XML 数据 html5lib解析器:

In [1]: from bs4 import BeautifulSoup

In [2]: data = "<content><12345>Golly</12345><67890>Jelly</67890></content>"

In [3]: soup = BeautifulSoup(data, "html5lib")
In [3]: print(soup.prettify())
<html>
 <head>
 </head>
 <body>
  <content>
   &lt;12345&gt;Golly
   <!--12345-->
   &lt;67890&gt;Jelly
   <!--67890-->
  </content>
 </body>
</html>

当然,这不是所需的输出,但可能是您可以使用并提取键和单词的东西。

关于python - 使用数字作为标签名称来解析损坏的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982331/

相关文章:

正则表达式:限制整个匹配和字符类

java - 将正则表达式与数组进行匹配

java - 如何转义xml中的<和≤符号?

xml - 如何过滤具有某个子节点的节点

c++ - 使用 TinyXML 解析 XML 元素

python - cv2.CalibrateCamera中retval返回值的含义

python - 在 scikit-learn ML 算法中使用 float64 数据类型是否正确?

python - 开发可在不同环境中运行的Python软件

python - python manager.dict() 锁定是如何工作的 :

javascript - 将最后一个 ", "替换为 "& "