Python XML sax解析器删除了所有内容,包括&;amp;
第一次海报。我会尽量说得具体一些。为了缩小问题范围,我无法控制xml文档的外观(我必须让解析器按原样处理文档)。文件格式正确(没有任何信息告诉我文档格式不正确,我也看不出有什么理由不正确)。我没有从程序中得到任何错误(或者从解析器中得到异常)。无论如何 我将一个xml文件(utf-8编码)输入到sax解析器中,并提取我需要的标记之间的信息(也需要属性时)。此文档有许多嵌套的标记(以及一些命名相同的标记)。为了确保到达文档中存储所需信息的区域,我使用了一系列设置/重置的标志(在看到开始标记时设置,在看到结束标记时重置)。如果满足某些条件(取决于设置的标志),则在内容处理程序的content函数中,我将信息附加到对象中保存的列表中。我不以任何方式修改内容,然后将对象的内容写入文件 在读取中的内容时,sax解析器将替换转义字符。因此:Python XML sax解析器删除了所有内容,包括&;amp;,python,python-2.7,xml-parsing,saxparser,Python,Python 2.7,Xml Parsing,Saxparser,第一次海报。我会尽量说得具体一些。为了缩小问题范围,我无法控制xml文档的外观(我必须让解析器按原样处理文档)。文件格式正确(没有任何信息告诉我文档格式不正确,我也看不出有什么理由不正确)。我没有从程序中得到任何错误(或者从解析器中得到异常)。无论如何 我将一个xml文件(utf-8编码)输入到sax解析器中,并提取我需要的标记之间的信息(也需要属性时)。此文档有许多嵌套的标记(以及一些命名相同的标记)。为了确保到达文档中存储所需信息的区域,我使用了一系列设置/重置的标志(在看到开始标记时设置,
<name>D & C YELLOW NO. 10</name>
但在文件中,当内容打印到控制台(在内容处理程序的characters函数中)时,字符串如下所示:
D
在文件和控制台打印中,该D后跟一个空格。我的问题是,这是某种bug还是我遗漏了什么
编辑:
提供相关代码。xmlFile只是一个包含文件名的字符串(如test.xml)
由于我没有以任何方式修改文件的内容,只是拉取它,所以我将提供解析器的框架
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.
是的,你错过了一些东西。从: 解析器将调用此方法来报告每个字符块 数据。SAX解析器可以在单个文件中返回所有连续字符数据 块,或者他们可以把它分成几个块
您可以尝试在
.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)
#/usr/bin/python
导入xml
导入xml.sax
导入StringIO
类NIHXMLparser:
类XMLContentHandler(xml.sax.ContentHandler):
定义初始化(自):
self.name=False
self.content=“”
def startElement(自身、名称、属性):
如果name=='name':
self.name=True
def字符(自身、内容):
self.content+=内容
定义元素(自身、名称):
如果self.name和name==“name”:
self.name=False
打印自己的内容
self.content=“”
xmlText=r'D&;丙黄十号'
xmlFile=StringIO.StringIO(xmlText)
XMLContentHandler=NIHXMLparser.XMLContentHandler()
parse(xmlFile,XMLContentHandler)
我想我也应该澄清一下。节目继续进行,其他一切都很好。我认为这是一个错误,因为你错过了一些东西。您可能需要在提供数据的地方使用相关代码更新问题。对此表示抱歉。我提供了一个关于发生了什么的简短描述。这些标志只是我在文档中单步执行并提取我需要的内容。欢迎使用堆栈溢出!你的密码。请提供一个完整的、自包含的程序来演示您所遇到的错误。有关更多信息,请参阅。鉴于此,应如何处理?我不明白,如果不能保证它会返回给你,你怎么可能得到你需要的包含在两个标记之间的完整数据块。@claymonstr-如果你想要打开标记和关闭标记之间的整个字符串,你必须收集所有的比特和片段。查看我最近的编辑。因此,在查看您的代码后,我看到它拆分了数据。语法分析器在读取第一块内容后是否会在文档中向前移动是的,语法分析器在读取每一项后都会不可阻挡地向前移动。我现在明白了。多谢!这件事我已经搞了好几天了。明天我会发布结果。
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.
#! /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)