1

嗨,目前我正在使用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'">�&lt;/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 格式,但我需要解析它。如何&nbsp;在将其提供给上述代码中的解析器之前从 xml 文件中忽略和 �(也应该转义所有错误和无效的 xml 标记)。

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

4

3 回答 3

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))

未经测试的代码。

于 2012-07-24T07:07:14.210 回答
2

你说你正在解析 XML 文件,但你错了。您正在解析非 XML 文件。XML 解析器被设计用来解析 XML,如果你给他们非 XML,他们会抱怨的。

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

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

于 2012-07-24T09:24:11.687 回答
1

当您的文件有效时,XML 最有意义。

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

如果您想要一个尽力而为的健壮和宽容的解析器,我建议您查看beautifulsoup. 它可以解析大多数 HTML 和类似 XML 的文件,而不需要完全定义所有内容。那时它仍然不是有效的 XML,但它可用于例如用户弄乱您的数据文件的情况。

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

于 2012-07-24T07:28:23.083 回答