来自 StringIO 源的 Python xml etree DTD?

2024-02-10

我正在调整以下代码(通过中的建议创建这个问题 https://stackoverflow.com/questions/2835077/lxml-unicode-entity-parse-problems),它采用 XML 文件及其 DTD,并将它们转换为不同的格式。对于这个问题,只有加载部分很重要:

xmldoc = open(filename)

parser = etree.XMLParser(dtd_validation=True, load_dtd=True)    
tree = etree.parse(xmldoc, parser)

在使用文件系统时,这工作得很好,但我将其转换为通过 Web 框架运行,其中两个文件通过表单加载。

加载 xml 文件工作正常:

tree = etree.parse(StringIO(data['xml_file']) 

但由于 DTD 链接到 xml 文件的顶部,因此以下语句失败:

parser = etree.XMLParser(dtd_validation=True, load_dtd=True)
tree = etree.parse(StringIO(data['xml_file'], parser)

Via 这个问题 https://stackoverflow.com/questions/15798/how-do-i-validate-xml-against-a-dtd-file-in-python, 我试过:

etree.DTD(StringIO(data['dtd_file'])
tree = etree.parse(StringIO(data['xml_file'])

虽然第一行不会导致错误,但第二行会落在 DTD 旨在拾取的 unicode 实体上(并且在文件系统版本中也是如此):

XMLSyntaxError:实体“eacute”不是 定义,第 4495 行,第 46 列

我该如何正确加载此 DTD?


这是一个简短但完整的示例,使用 @Steven 提到的自定义解析器技术。

from StringIO import StringIO
from lxml import etree

data = dict(
    xml_file = '''<?xml version="1.0"?>
<!DOCTYPE x SYSTEM "a.dtd">
<x><y>&eacute;zz</y></x>
''',
    dtd_file = '''<!ENTITY eacute "&#233;">
<!ELEMENT x (y)>
<!ELEMENT y (#PCDATA)>
''')

class DTDResolver(etree.Resolver):
     def resolve(self, url, id, context):
         return self.resolve_string(data['dtd_file'], context)

xmldoc = StringIO(data['xml_file'])
parser = etree.XMLParser(dtd_validation=True, load_dtd=True)
parser.resolvers.add(DTDResolver())
try:
    tree = etree.parse(xmldoc, parser)
except etree.XMLSyntaxError as e:
    # handle xml and validation errors
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 StringIO 源的 Python xml etree DTD? 的相关文章

随机推荐

  • 在支持超线程的四核 CPU 上运行的单 CPU 程序

    我是统计模式识别领域的研究员 我经常进行持续很多天的模拟 我正在运行 Ubuntu 12 04 和 Linux 3 2 0 24 generic 据我所知 它支持多核和超线程 使用带有 HTT 的 Intel Core i7 Sandy B
  • azure 中何时创建了块 blob?

    blob 引用包含一个Properties财产有一个LastModified of DateTimeOffset 但是 我找不到 blob 的创建日期 时间 是否有我可以使用的标准 API 或者我需要将其存储在元数据中 public asy
  • 我可以使用Boost消息队列进行线程通信吗

    我正在从主线程生成多个工作线程 我可以从主线程为每个线程创建 message queue 并从主线程发送消息吗 我问这个是因为消息队列是用于进程间通信的吗 我需要考虑与此相关的任何具体事项吗 正如所提到的Boost Message Queu
  • 当分母中的元素可能为零时,有效的逐元素矩阵除法

    我正在使用 numpy 使用 Python 2 7 6 进行编程 我在两个 numpy 矩阵之间进行了划分V np dot W H 有时 分母的某些单元格值等于 0 因此我会收到运行时错误 我想以有效的方式实施安全划分 我如何编写执行矩阵除
  • 为左浮动 div 或列表设置文本溢出省略号

    这是我想做的 创建一个仅占用所需空间 水平 的列表 即最长的列表元素 当列表不适合页面时 修剪列表文本并显示省略号 我使用的组合white space nowrap and text overflow ellipsis 对于普通列表来说它工
  • 在ios中使用AVAudioSession时出错

    我用了这些代码 void viewDidLoad AVAudioSession sharedInstance setDelegate self AVAudioSession sharedInstance setCategory AVAudi
  • 如何以八度增加命令窗口的字体大小

    我试图弄清楚如何增加命令窗口文本 我想通了legend legend fontsize 10 Low fontsize 10 Medium fontsize 10 High 我尝试做同样的事情 但是command command windo
  • 谷歌地图无法正确呈现

    我正在使用主干和 gmaps js 由于某种原因 地图无法正确渲染 控制器没有正确显示 信息窗口的渲染也很奇怪 我正在使用gmaps js 库 https github com HPNeo gmaps 我什至不知道如何调试这个东西 这是我的
  • 计数信号量和二进制信号量之间的区别

    计数和二进制信号量有什么区别 我在某处看到的是 两者都可以控制 N 个请求资源的进程 两者都拥有自由邦 二进制信号量和计数信号量可以保护的资源数量是否有限制 两者都只允许一个进程一次使用一种资源 还有其他区别吗 上述属性是否正确 实际上 这
  • python语法错误无效语法[重复]

    这个问题在这里已经有答案了 我是 Python 编程语言的新手 我买了一本书并且一直在读 这本书的名字是 3x Python 初学者编程第三版 我正在努力将迄今为止所学到的知识付诸实践 我有一个我不明白的问题 我知道它很简单 但我不确定如何
  • 如何在 SQLAlchemy for MSSQL 中设置架构?

    我目前这样做 usr bin env python 3rd party modules from sqlalchemy import create engine requires pymssql local modules from con
  • 如何尽可能快地将大量记录插入MySql数据库

    我有一个如下所示的数据库表 create table temperature id int unsigned not null auto increment primary key temperature double 在我的程序中 我将大
  • 从 Xamarin.Forms 应用程序打印

    我是 Xamarin 新手 目前正在使用 Xamarin Forms 开发示例或 概念证明 应用程序 我应该从这个应用程序执行打印任务 尽管我现在还不确定要打印什么 屏幕 标签内容 文件等 无论哪种方式 从 Xamarin Forms 应用
  • 使用来自互联网的图像更新 Android 小部件(使用异步任务)

    我有一个简单的 Android 小部件 我想用互联网上的图像进行更新 我可以在小部件上显示静态图像 没有问题 有人告诉我 您需要为此使用异步任务 而我对此没有太多经验 这是我的小部件 Override public void onUpdat
  • Docker Rancher - 从 WSL 使用 docker 时权限被拒绝

    我已经在 Windows 10 上使用 dockerd 选项安装了 Docker Rancher 并为我当前的 WSL 发行版 Ubuntu 安装了 WSL 当我尝试在 WSL2 中使用 docker 时 出现以下错误 fpapi xxx
  • Java 中 int 转换为数组 char

    我试图在不使用字符串操作的情况下将整数转换为字符数组 我的尝试是 int number 12 char test Character toChars number for char c test System out println c 没
  • 在多对多关系上添加元素

    我正在做一个项目 从学校的角度 你可以计算每个学生的平均值 您可以在一个屏幕上注册学生 第一个实体 在另一个屏幕上注册科目 第二个实体 学生有姓名 电子邮件 成绩和平均分作为属性 科目有姓名 它们彼此之间是多对多关联的 我正在尝试为每个学生
  • UITableView 和单元格重用

    我有一个UITableView我已经子类化了UITableViewCell 叫它CustomCell 所以它有几个标签和一个UIImageView 只有某些单元格才会真正显示图像 这是我的代码tableView cellForRowAtIn
  • 如何获取AVPlayer的视频帧?

    我有 PlayerView 类用于显示 AVPlayer 的播放 代码来自文档 https developer apple com library archive documentation AudioVideo Conceptual AV
  • 来自 StringIO 源的 Python xml etree DTD?

    我正在调整以下代码 通过中的建议创建这个问题 https stackoverflow com questions 2835077 lxml unicode entity parse problems 它采用 XML 文件及其 DTD 并将它