使用非法特殊字符 (&) 解析 XML [重复]

Posted

技术标签:

【中文标题】使用非法特殊字符 (&) 解析 XML [重复]【英文标题】:Parsing XML with illegal special characters (&) [duplicate] 【发布时间】:2021-07-24 03:20:27 【问题描述】:

我有成千上万的 XML 文件,比如 follow

<names>
    <Id>1518845</Id>
    <Name>Confessions of a Thug (Paperback)</Name>
    <Authors>Philip Meadows Taylor</Authors>
    <Publisher>Rupa & Co</Publisher>
    <CountsOfReview>2.0</CountsOfReview>
</names>

我已经尝试了下面的代码来解析

from lxml import etree

root = etree.parse("xm_file.xml")
import xml.etree.ElementTree as ET

tree = ET.parse("xm_file.xml")

parser = ET.XMLParser(encoding="utf-8")
tree = ET.parse("xm_file.xml", parser=parser)

所有这些都会导致其中一个错误

ParseError: not well-formed (invalid token): line 10, column 18
XMLSyntaxError: xmlParseEntityRef: no name, line 10, column 19

我搜索并尝试了很多解决方案来解决这个问题,但徒劳无功

注意:这对我没有帮助:How to parse invalid (bad / not well-formed) XML?

另一种情况是

<names>
    <Id>1481744</Id>
    <Name>Lettres de René-Édouard Claparède <1832-1871>.: Choisies et annotées</Name>
    <Authors>René-Édouard Claparède</Authors>
    <ISBN>3796505635</ISBN>
    <Rating>2.0</Rating>
    <PublishYear>1971</PublishYear>
    <PublishMonth>31</PublishMonth>
    <PublishDay>12</PublishDay>
</names>

在解析它时,只需像处理 XML 一样处理它:

<names>
    <Id>1481744</Id>
    <Name>Lettres de René-Édouard Claparède</Name>
</names>

其他信息不显示

【问题讨论】:

也许这有帮助? ***.com/questions/7604436/… 这是 python 不是 php 但是解决方法是一样的。 这不是 XML,Jim,至少不是我们所知道的。您的问题标题不正确 - 您尝试解析的内容 不是 XML 您没有成千上万的 XML 文件。您有数以千计的非 XML 文件。事实上,你有一堆垃圾。 【参考方案1】:

您可以预先替换 &amp;

import xml.etree.ElementTree as ET

data = """

<names>
    <Id>1518845</Id>
    <Name>Confessions of a Thug (Paperback)</Name>
    <Authors>Philip Meadows Taylor</Authors>
    <Publisher>Rupa & Co</Publisher>
    <CountsOfReview>2.0</CountsOfReview>
</names>

"""

data = data.replace('&', '&amp;')
tree = ET.ElementTree(ET.fromstring(data))

for publisher in tree.findall("Publisher"):
    print(publisher.text)

产量

Rupa & Co

一种可能的方法是之前加载有问题的文件,替换 &amp; 并将其提供给 xml.etree.ElementTree,如下所示:

with open("some_cool_file") as fp:
    content = fp.read()
    content = content.replace('&', '&amp;')
    xml = ET.ElementTree(ET.fromstring(content))

【讨论】:

请查看我对问题的编辑 不错的尝试,但 OP 为您添加了另一个测试。 @Jan,像这样替换&amp; 是危险的,因为数据中可能存在实际的 XML 实体,这些实体随后会被破坏。是的,您可以使用更复杂的正则表达式来捕获其中的许多。无论如何,如何解析错误的“XML”这个一般性话题已经在其他问答中得到了更彻底的解决。

以上是关于使用非法特殊字符 (&) 解析 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

xml特殊字符处理

使用 SAX 解析 XML |如何处理特殊字符?

xml中的实体引用

如何解析iOS中具有特殊字符的xml数据?

如何处理 XML 中 URL 中的特殊字符

xml 转义字符