Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XML sax解析器删除了所有内容,包括&;amp;_Python_Python 2.7_Xml Parsing_Saxparser - Fatal编程技术网

Python XML sax解析器删除了所有内容,包括&;amp;

Python XML sax解析器删除了所有内容,包括&;amp;,python,python-2.7,xml-parsing,saxparser,Python,Python 2.7,Xml Parsing,Saxparser,第一次海报。我会尽量说得具体一些。为了缩小问题范围,我无法控制xml文档的外观(我必须让解析器按原样处理文档)。文件格式正确(没有任何信息告诉我文档格式不正确,我也看不出有什么理由不正确)。我没有从程序中得到任何错误(或者从解析器中得到异常)。无论如何 我将一个xml文件(utf-8编码)输入到sax解析器中,并提取我需要的标记之间的信息(也需要属性时)。此文档有许多嵌套的标记(以及一些命名相同的标记)。为了确保到达文档中存储所需信息的区域,我使用了一系列设置/重置的标志(在看到开始标记时设置,

第一次海报。我会尽量说得具体一些。为了缩小问题范围,我无法控制xml文档的外观(我必须让解析器按原样处理文档)。文件格式正确(没有任何信息告诉我文档格式不正确,我也看不出有什么理由不正确)。我没有从程序中得到任何错误(或者从解析器中得到异常)。无论如何

我将一个xml文件(utf-8编码)输入到sax解析器中,并提取我需要的标记之间的信息(也需要属性时)。此文档有许多嵌套的标记(以及一些命名相同的标记)。为了确保到达文档中存储所需信息的区域,我使用了一系列设置/重置的标志(在看到开始标记时设置,在看到结束标记时重置)。如果满足某些条件(取决于设置的标志),则在内容处理程序的content函数中,我将信息附加到对象中保存的列表中。我不以任何方式修改内容,然后将对象的内容写入文件

在读取中的内容时,sax解析器将替换转义字符。因此:

<name>D &amp; 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 &amp; 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 &amp; C YELLOW NO. 10</name>'
xmlFile = StringIO.StringIO(xmlText)

XMLContentHandler=NIHXMLparser.XMLContentHandler()
xml.sax.parse(xmlFile,XMLContentHandler)