首页 > 编程问答 >Python XML 解析:字符串中的“<”被阻塞

Python XML 解析:字符串中的“<”被阻塞

时间:2024-07-25 04:55:47浏览次数:11  
标签:python xml xml-parsing

我有一个使用 ET.XMLParser 来解析 CppCheck XML 报告文件的 Python 模块。当尝试解析字符串中包含“<”的 XML 元素中的属性之一时,它会令人窒息,它会将其解释为格式错误的 XML,例如:

<error msg="Include file <iostream> not found.">

(注意字符和“iostream”之间的空格必须放置,否则它不会在这个论坛中正确发布)

当我这样做时,它很令人窒息:

ET.parse(xml_filename)

显然我无法转义文件中的所有“<”和“>”。有什么建议么?


遇到的问题是 CppCheck 生成的 XML 报告没有正确转义 <iostream> 中的 < 字符。解决此问题的最佳方法是在源头修复 CppCheck 报告,确保它生成格式良好的 XML。

但是,如果无法修改 CppCheck 的输出,则可以使用以下几种方法在 Python 中解决此问题:

1. 使用正则表达式预处理 XML:

在解析 XML 之前,可以使用正则表达式替换 < 字符(不在标签内)。

import re
import xml.etree.ElementTree as ET

def fix_xml(xml_string):
  """修复 XML 字符串中的无效 '<' 字符。"""
  return re.sub(r'&(?!(lt;|gt;|amp;|apos;|quot;))', '&amp;', xml_string)

# 读取 XML 文件
with open(xml_filename, 'r') as f:
  xml_string = f.read()

# 使用正则表达式修复 XML
fixed_xml_string = fix_xml(xml_string)

# 解析修复后的 XML
root = ET.fromstring(fixed_xml_string)

# 现在可以正常解析 XML 了
# ...

这个方法利用了“negative lookahead assertion” ( (?!...) ) 来确保只替换不在已知实体 ( &lt; , &gt; , &amp; , &apos; , &quot; ) 中的 & 字符。

2. 使用 SAX 解析器:

SAX(Simple API for XML)解析器逐行读取 XML,并为遇到的每个元素触发事件。可以使用 SAX 解析器拦截字符数据事件,并在解析 XML 之前手动替换无效字符。

from xml.sax import make_parser, handler

class ContentHandler(handler.ContentHandler):
  def __init__(self):
    self.data = ''

  def characters(self, content):
    self.data += content.replace('&lt;', '<').replace('&gt;', '>')

# 创建 SAX 解析器
parser = make_parser()

# 设置 ContentHandler
handler = ContentHandler()
parser.setContentHandler(handler)

# 解析 XML 文件
with open(xml_filename, 'r') as f:
  parser.parse(f)

# 获取解析后的数据
data = handler.data

# 使用 ElementTree 或其他 XML 解析库解析数据
# ...

这种方法需要编写更多代码,但它可以更好地控制 XML 解析过程,并且可能比使用正则表达式更有效。

无论选择哪种方法,修复 CppCheck 报告以生成格式良好的 XML 都是最佳的长期解决方案。

标签:python,xml,xml-parsing
From: 78790276

相关文章

  • 任意几行代码要成为Python中的函数需要什么?
    我正在上一门计算机科学课,我的任务是创建一个程序来实现一个带有参数的函数。我的老师告诉我,下面的代码不是一个函数,这让我很困惑,对于将某些代码行归类为“函数”所需的条件,我感到很困惑。defgame(numbers,max_turns,pfl,tgl):turns=0flag=Falseprint("You......
  • 如何使用 Python 创建新的 Azure 订阅?
    我正在尝试使用PythonSDK以编程方式创建新的Azure订阅。我发现的对AzurePythonSDK的唯一引用是这个这是我最终得到的结果:importazure.mgmt.billingimportazure.mgmt.subscriptioncreds=AzureCliCredential()client_name='test'defcreat......
  • 用于打印脚本输出的 Python 实用程序
    我可以发誓有一个实用程序可以打印一个python脚本,其输出交织在一起。例如,给定一个脚本:a=2b=3print(a+b)print(a*b)该实用程序将输出a=2b=3print(a+b)#>5print(a*b)#>6有人知道该实用程序的名称吗?我最难找到它。谢谢你!描述的实用程序没有标......
  • a method to make some handy tools with python
    Inmyworkingofcomputer,therearealotofsimplejobsthatarefrequentlyrepeated.Itriedtofindawaytomakethesejobbeenprocessedeasily.Method1:Themethodiswritingascripttodothejob,andexecutingthescriptbyutoolsextensionuto......
  • Python网络爬虫详解:实战豆瓣电影信息采集
    文章目录前言一、爬虫是什么?二、常用库及其作用1.Requests2.BeautifulSoup3.lxml4.Scrapy5.Selenium6.PyQuery7.Pandas8.JSON9.Time三、实现步骤步骤一:环境准备步骤二:数据采集步骤三:数据处理步骤四:数据存储总结前言随着互联网的迅猛发展和数据分析需求的不......
  • python学习之内置函数
    Python拥有许多内置函数,这些函数是Python的一部分,不需要额外导入即可直接使用。这些函数提供了对Python解释器功能的直接访问,涵盖了从数学计算到类型检查、从内存管理到异常处理等各个方面。下面是一些常用的Python内置函数及其简要说明:一、Printprint函数大家都不会......
  • Python中以函数为作用域
    点击查看代码#第一题foriteminrange(10):#不报错,没有函数,所有操作在全局作用域里面执行,item最后赋值为:9,此时item在缩进与全局都可以使用passprint(item)#第二题item=10deffunc():foriteminrange(10):#优先在本地查找,找不到在到全局查找p......
  • 掌握IPython宏:%%macro命令的高效使用指南
    掌握IPython宏:%%macro命令的高效使用指南在编程中,宏是一种允许你定义可重用代码片段的强大工具。IPython,这个增强版的Python交互式环境,提供了一个名为%%macro的魔术命令,允许用户创建宏,从而提高代码的可重用性和效率。本文将详细介绍如何在IPython中使用%%macro命令创建宏,并......
  • 7月24号python:库存管理
    7月24号python:库存管理题目:​ 仓库管理员以数组stock形式记录商品库存表。stock[i]表示商品id,可能存在重复。原库存表按商品id升序排列。现因突发情况需要进行商品紧急调拨,管理员将这批商品id提前依次整理至库存表最后。请你找到并返回库存表中编号的最小的元素以便及......
  • IPython的Bash之舞:%%bash命令全解析
    IPython的Bash之舞:%%bash命令全解析IPython的%%bash魔术命令为JupyterNotebook用户提供了一种在单元格中直接执行Bash脚本的能力。这个特性特别适用于需要在Notebook中运行系统命令或Bash特定功能的场景。本文将详细介绍如何在IPython中使用%%bash命令,并提供实际的代码示......