第一次海报。我会尽量具体。为了缩小问题范围,我无法控制 xml 文档的外观(我必须让解析器按原样处理该文档)。该文件格式良好(没有任何信息告诉我该文档格式不正确,而且我看不出有什么理由不这样做)。我没有从程序返回任何错误(或解析器的异常)。无论如何...
我将一个 xml 文件(utf-8 编码)输入到 sax 解析器中,并提取我需要的标签之间的信息(也需要时的属性)。该文档有很多嵌套标签(以及一些名称相同的标签)。为了确保我到达文档中存储所需信息的区域,我使用了一系列设置/重置的标志(当我看到开始标签时设置,当我看到结束标签时重置) )。如果满足某些条件(取决于设置的标志),在内容处理程序的内容函数中,我将信息附加到对象内保存的列表中。我不会以任何方式修改内容,然后将对象的内容写入文件。
当它读取内容时,sax 解析器会替换转义字符。所以这个:
<name>D & C YELLOW NO. 10</name>
应该变成这样:
D & C YELLOW NO. 10
但是在文件中,当内容打印到控制台时(在内容处理程序的字符函数中),字符串读取为:
D
在文件和控制台打印中,D 后跟一个空格。我的问题是,这是某种错误还是我遗漏了什么?
编辑: 提供了相关代码。 xmlFile 只是一个包含文件名的字符串(即像 test.xml)。
XMLContentHandler=NIHXMLparser.XMLContentHandler()
xml.sax.parse(xmlFile,XMLContentHandler)
由于我不会以任何方式修改文件的内容,只是提取它,因此我将提供解析器的框架。
class XMLContentHandler(xml.sax.ContentHandler):
def __init__(self):
#initializing some flags to false
def startElement(self, name, attrs):
#set flags according to what tag
#names appear.
def characters(self,content):
#depending on certain flags being set
#I just pull out the info between there.
#No modifications made. The sax parser
#parses the content variable on its own.
#I have no control over what it sends back.
def endElement(self,name):
#resets flags here.
最佳答案
是的,你错过了一些东西。来自 xml.sax.ContentHandler.characters
documentation :
<小时/>The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks ...
您可以尝试在 .characters()
中收集文本并在 endElement
中发出它,如下所示:
#! /usr/bin/python
import xml
import xml.sax
import StringIO
class NIHXMLparser:
class XMLContentHandler(xml.sax.ContentHandler):
def __init__(self):
self.name = False
self.content = ''
def startElement(self, name, attrs):
if name == 'name':
self.name = True
def characters(self,content):
self.content += content
def endElement(self,name):
if self.name and name == 'name':
self.name = False
print self.content
self.content = ''
xmlText = r'<name>D & C YELLOW NO. 10</name>'
xmlFile = StringIO.StringIO(xmlText)
XMLContentHandler=NIHXMLparser.XMLContentHandler()
xml.sax.parse(xmlFile,XMLContentHandler)
关于Python XML sax 解析器删除所有内容,包括 &,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791528/