如何在Python中使用SAX生成XML输出时插入DTD DOCTYPE内容
我正在尝试用Python(其实是Jython)生成一个很大的XML文件,使用的是xml.sax.saxutils中的XMLGenerator。
我想在文件中加入DTD信息,但我不知道怎么把DTD字符串传给SAX。下面是一个示例的SAX写入类:
from xml.sax.saxutils import XMLGenerator
class xml_writer:
def __init__(self, output, encoding):
"""
an XML writer object that generate xml output to a file
"""
xmlwriter = XMLGenerator(output, encoding)
xmlwriter.startDocument()
self._writer = xmlwriter
self._output = output
self._encoding = encoding
self.attr_vals = {}
self.attr_qnames = {}
return
def start_elem(self, name):
name = unicode(name)
attrs = AttributesNSImpl(self.attr_vals, self.attr_qnames)
self._writer.startElementNS((None, name), name, attrs)
self._writer._out.write('\n')
self.attr_qnames = {}
self.attr_vals = {}
def end_elem(self, name):
name = unicode(name)
self._writer.endElementNS((None, name), name)
self._writer._out.write('\n')
def setAttribute(self, aname, value):
aname = unicode(aname)
value = unicode(value)
self.attr_vals[(None, aname)] = value
self.attr_qnames[(None, aname)] = aname
def close(self):
"""
Clean up
"""
self._writer.endDocument()
return
谢谢你的帮助。
1 个回答
3
你可以创建一个新的类,叫做 XMLGenerator
的子类,并在里面添加一个 write()
方法。下面是一个例子:
import sys
from xml.sax.saxutils import XMLGenerator
class MyXMLGenerator(XMLGenerator):
def __init__(self, out=sys.stdout, encoding="UTF-8"):
XMLGenerator.__init__(self, out, encoding)
self.out = out
def write (self,s):
self.out.write(s)
def writexml(out):
xmlwriter = MyXMLGenerator(out)
xmlwriter.startDocument()
xmlwriter.write("<!DOCTYPE test SYSTEM 'test.dtd'>\n")
xmlwriter.startElement('test', {"a": "1"})
xmlwriter.characters('abc123')
xmlwriter.endElement('test')
xmlwriter.endDocument()
if __name__ == '__main__':
writexml(out=open("out.xml", "w"))
生成的输出会保存在 out.xml 文件中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test SYSTEM 'test.dtd'>
<test a="1">abc123</test>