【问题标题】:How to ignore   and special characters from xml tag before giving xml file to parser如何在将 xml 文件提供给解析器之前忽略 xml 标记中的特殊字符和特殊字符
【发布时间】:2012-07-24 06:21:52
【问题描述】:

您好,目前我正在使用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 文件中忽略 &amp;nbsp; 和 �(也应该转义所有错误和无效的 xml 标记)。

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

【问题讨论】:

  • 如果您的 XML 文件没有对其编码撒谎...
  • @Ignacio Vazquez-Abrams:实际上一切正常,但它在特殊字符和 & 处停止,如上所示,因此如何在输入 sax 解析器之前忽略 xml 中的那些

标签: python xml


【解决方案1】:

如果您只是想从您的输入中替换 &amp;[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))

未经测试的代码。

【讨论】:

  • 但这会忽略所有实体,而不仅仅是&amp;nbsp;
  • @Tichodroma:对不起,我在这个意义上没有得到“所有实体”?
  • @Ticho 随时编辑以改进它,这是我能很快做出来的最好的东西
  • “所有实体”包括&amp;auml; 等。你也想删除这些吗?
  • @Patrick :实际上我的意思是忽略“&”(特殊字符),因为它是无效的 xml 令牌
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多