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

标签 python python-2.7 xml-parsing saxparser

第一次海报。我会尽量具体。为了缩小问题范围,我无法控制 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.

最佳答案

是的,你错过了一些东西。来自 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 &amp; 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/

相关文章:

python - 为什么 1.__add__(1) 会产生语法错误?

Python计算器代码不能正确除法和乘法

algorithm - 用于 JBPM 的可视化 BPMN 2.0 差异工具

java - Xml反序列化ValueRequiredException

python - 编写一个递归函数,返回最长连续序列的数字

java - Java如何从XML文档中获取键值对

python - 根据不同的标准规则检查列表

Python 套接字发送缓冲区与。强度

python - 为什么 getpwuid 和 getgrgid 有不同的行为?

python - 如何使用 python 将 .txt 文件转换为 xml 文件?