1

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

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

当它读入内容时,sax 解析器会替换转义字符。所以这:

<name>D &amp; 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.
4

1 回答 1

3

是的,你错过了一些东西。从xml.sax.ContentHandler.characters文档中:

Parser 将调用此方法来报告每个字符数据块。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)
于 2013-11-05T15:57:17.363 回答