嗨,目前我正在使用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"> </SPAN>Position will manage 24 ED Rooms with 24/7 accountability<o:p></o:p></FONT></SPAN></FONT></P>
<DIV> </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文件中忽略
和((也应该转义所有错误和无效的xml标记),然后再将其提供给上面代码中的解析器。
提前致谢........
答案 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文件,您的解析器是正确的停止。例如,必须定义
等实体。所以您的文件应该有文档类型。这不仅仅是为了好玩,但文档类型实际上定义了实体等。
如果您想要一个尽力而为的强大且容忍的解析器,我建议您查看beautifulsoup
。它可以解析大多数HTML和类似XML的文件,而不需要完全定义所有内容。它仍然不是有效的XML,但它可用于例如以下情况:用户搞砸了你的数据文件。
从文件中删除字符是一个HACK,迟早会破坏。我不建议这样做。