说我有这样的xml(真正的xml比较复杂):
我已经用BeautifulSoup(lxml)解析了它,因为我不能使用正则表达式。 现在,我用包含新的有效xml(取决于属性)的字符串替换。 这并不难。
但我想这样做而不用BeautifulSoup解析新的xml。 原因是我会在之后立即美化它。 有相当多的标记已被大量的xml取代。 解析然后美化所有内容的性能不是很高。
是否有类似LiteralXmlPleaseDontParseThisTnx的节点? (我找不到它,他们一定叫它其他东西,并且'raw html','unparsed html','literal hmtl'的相关点击太多了。)
或者,是否有办法美化上面的xml,然后以纯文本的形式插入新的xml(无需对xml进行有效假设)?
看一下lxml。 也许对您有帮助。
BeautifulSoup用于解析HTML。您拥有的不是HTML,而是XML,因此您可能不应该使用BeautifulSoup,而应直接使用lxml。
lxml Element确实具有replace方法,但是必须向其传递一个Element而不是字符串。目前尚不清楚您要用什么替换,但是如果您从一开始就将替换值创建为Element,则无需解析就可以进行替换。
相反,如果您只是想放一个任意字符串代替,那么,这不是对XML文档的格式正确的操作,并且该库也无法保证粘贴的内容格式正确,并且因此,不可能序列化给定的结果。大多数XML库将特别禁止该操作,因为它会违反基本假设并保证XML库正在尝试维护。
我用包含有效xml的字符串替换了(编辑了问题以进行澄清)。 感谢直接使用lxml的提示,我在使用BeautifulSoup时没有遇到麻烦,但是最好使用适当的库。 太糟糕了,可能无法解决性能问题。
我找到了一种创建相同结果的方法,这种方法对我来说很奏效,但可能并不普遍适用。在问题的"替代"类别中:在解析的汤之外进行替换。
解析主文档之前,请使用转义字符串格式化大括号:
escaped = sub(r'({|})', r'\1\1', input)
soup = BeautifulSoup(escaped, 'lxml') # or lxml
将替换为替换字符串(对于所有字符串):
name = c_tag.attrs['replace']
ctag.replace_with(NavigableString('{' + name + ':s}'))
将所有替换项存储在字典中(可能已经存在):
rep = {'alpha': '', 'beta': 'hi'}
使用字符串格式进行所有替换:
output = soup.prettify().format(**rep)
我承认我的案件有些特殊,因此也许对其他人没有帮助。但是在我的情况下,每个都可以由包含更多的xml代替。由于多进程通信,每个级别都需要解析或腌制。 (腌制仅比解析快20-50%,并达到硬递归限制)。因此只需要执行一次而不是每个级别都可以节省很多时间(在我测试的情况下为3),因为正则表达式替换和字符串替换比解析快得多。