1

こんにちは、現在、xml.sax.handlerxml ファイルの解析に使用しています。

以下は私の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

XMLファイルを解析していると言いますが、間違っています。非XMLファイルを解析しています。XMLパーサーは、XMLを解析するように設計されており、非XMLを指定すると、当然のことながら文句を言います。

システムで非XML形式のメッセージを処理する場合、最初に行うことは、システム記述からのXMLに関するすべての言及と、XMLツールを使用して解析を行うことについてのすべての考えを放棄することです。システムでXMLを使用する必要はありませんが、ほぼXMLであるが、完全ではないものを使用してもまったく意味がありません。

別の方法は、これらのメッセージを生成しているプログラムを変更して、適切な整形式のXMLを生成することです。

于 2012-07-24T09:24:11.687 に答える
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 に答える
1

XML は、ファイルが有効な場合に最も意味があります。

これは有効な XML ファイルではありません。パーサーは停止しても問題ありません。たとえば、&nbsp; must be definedなどのエンティティ。したがって、ファイルには document type が必要です。これは単なる楽しみではありませんが、ドキュメント タイプは実際にエンティティなどを定義します。

ベストエフォート型の堅牢で寛容なパーサーが必要な場合は、 を参照することをお勧めしbeautifulsoupます。すべてを完全に定義する必要なく、ほとんどの HTML および XML に似たファイルを解析できます。その時点ではまだ有効な XML ではありませんが、ユーザーがデータ ファイルを台無しにするなどの状況では使用できます。

ファイルから文字を削除することは HACK であり、遅かれ早かれ機能しなくなります。これを行うことはお勧めできません。

于 2012-07-24T07:28:23.083 に答える