首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自StringIO源的?

来自StringIO源的?
EN

Stack Overflow用户
提问于 2010-09-28 21:19:33
回答 2查看 3.1K关注 0票数 4

我正在调整下面的代码(通过这个问题中的通知创建),它使用了一个XML文件,它是DTD,并将它们转换成不同的格式。对于这个问题,只有加载部分是重要的:

代码语言:javascript
复制
xmldoc = open(filename)

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

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

加载xml文件工作得很好:

代码语言:javascript
复制
tree = etree.parse(StringIO(data['xml_file']) 

但是,当DTD链接到xml文件的顶部时,以下语句将失败:

代码语言:javascript
复制
parser = etree.XMLParser(dtd_validation=True, load_dtd=True)
tree = etree.parse(StringIO(data['xml_file'], parser)

通过这个问题,我尝试了:

代码语言:javascript
复制
etree.DTD(StringIO(data['dtd_file'])
tree = etree.parse(StringIO(data['xml_file'])

虽然第一行不会导致错误,但第二行落在了DTD要提取的unicode实体上(在文件系统版本中是这样做的):

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

如何正确加载此DTD?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-16 04:07:58

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

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2010-09-29 08:39:24

您可能需要一个自定义解析器。文档实际上给出了这样做以提供dtd的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3817137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档