在将xml文件提供给解析器之前,如何忽略xml标记中的特殊字符

时间:2012-07-24 06:21:53

标签: python xml

嗨,目前我正在使用xml.sax.handler来解析xml文件。

以下是我的 file.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<sturp>
  <gear>
   <UL>
   <LI><I>Free Private Housing or a Generous Housing Allowance</I></LI>
   <LI><I>$50K in Free Life Insurance coverage</I></LI>
   </UL>
   <P style="MARGIN: 0in 0in 0pt" class="MsoNormal"><FONT size="3"><SPAN style="FONT-FAMILY: Symbol; COLOR: black; mso-ascii-font-family: 'Times New Roman'">�</SPAN><SPAN style="COLOR: black"><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Position will manage 24 ED Rooms with 24/7 accountability<o:p></o:p></FONT></SPAN></FONT></P>
   <DIV>&nbsp;</DIV>
  </gear> 
</sturp>

下面是我的代码

xmlFilePath = 'user/documents/file.xml'

try:
    parser = xml.sax.make_parser( )
    handler = FeedHandler( conn, clientSiteId, clientId, documentElementName, jobElementName )
    handler.setMapping( mapping )
    parser.setContentHandler(handler)
    parser.setEntityResolver(handler)

    parser.parse(open(xmlFilePath))

except (xml.sax.SAXParseException), e:
        print "*** PARSER error: %s" % e

输出:

*** PARSER error: user/documents/file.xml:8:150: not well-formed <invalid token>
*** PARSER error: user/documents/file.xml:9:1: not well-formed <invalid token>

实际上给我的源xml文件不是有效的xml格式,但我需要解析它。 如何在xml文件中忽略&nbsp;和((也应该转义所有错误和无效的xml标记),然后再将其提供给上面代码中的解析器。

提前致谢........

3 个答案:

答案 0 :(得分:2)

如果您只是想从输入中替换&[a-z]+;个实体,可以使用下面的黑客攻击解决方案。但请注意,如果您希望它能正常工作,您仍应该为解析器提供有效的xml文件。

import os, re

对于解析器:

def ignore_open( p ):
  temf = 'temp_file'
  with open(temf,'wt') as temp:
    o = open(p,'r')
    temp.write(re.sub("\&[^\;]+;",'', o.read()))
  rs = open(temf)
  os.unlink(temf)
  return rs

结果

>>> parser.parse(ignore_open(xmlFilePath))

未经测试的代码。

答案 1 :(得分:2)

你说你正在解析XML文件,但你错了。您正在解析非XML文件。 XML解析器旨在解析XML,如果你给它们非XML,他们会正确地抱怨。

如果您希望系统以非XML格式处理消息,那么首先要做的是放弃系统描述中提及的所有XML以及使用XML工具进行解析的所有想法。您不必在系统中使用XML,但使用几乎是XML但不完全的东西绝对没有意义。

另一种方法是更改​​生成这些消息的程序,以便生成格式正确的XML。

答案 2 :(得分:1)

当文件有效时,XML很有意义。

这是有效的XML文件,您的解析器是正确的停止。例如,必须定义&nbsp; 等实体。所以您的文件应该有文档类型。这不仅仅是为了好玩,但文档类型实际上定义了实体等。

如果您想要一个尽力而为的强大且容忍的解析器,我建议您查看beautifulsoup。它可以解析大多数HTML和类似XML的文件,而不需要完全定义所有内容。它仍然不是有效的XML,但它可用于例如以下情况:用户搞砸了你的数据文件。

从文件中删除字符是一个HACK,迟早会破坏。我不建议这样做。