1

外部ソースから取得した XML ファイルを解析しようとしていますが、テキスト ノードにエンコードされていない XML エンティティがあるため、問題が発生しています。

基本的に、私はこれと同じ質問をしていますが、PHP ではなく Perl を対象としています。

<report>  
  <company>A & W</company>  
  <company>Some Other Company with a < in Inc.</company>
</report>  

私はこのようなものを使用してみました:

my $readAllRecordsURI = "http://mycompany.com/CompanyOnline/GetRecord";
my @form_array = ("action" => "readAll", "table" => "QOPIDINF");

my $ua = LWP::UserAgent->new;

my $cics_request = (POST $readAllRecordsURI, \@form_array);          
my $cics_response = $ua->request($cics_request);
my $xmlfile = $cics_response->content;

my $parser = XML::Parser->new( Handlers => {Char  => \&handle_char});
$parser->parsefile( $xmlfile );


sub handle_char {
   my ($p, $string) = @_;

   #clean up text here...
}
4

3 に答える 3

1

これは本当に答えではありませんが、私の問題を解決します。私が行ったことは、XML を提供したプログラマーに戻って、このすべてを回避するためにテキストを適切にエンコードするよう依頼したことです。

于 2010-04-28T14:35:27.357 に答える
0

XML::Parser / Expat has always worked well for me, including with poorly formed XML.

Do NOT parse XML with a regex.... unless your parser does not work >;-} ... Can you just deleted the company name with a < in it before parsing?

Here are some regexs to try: XML Shallow Parsing with regex -- At the bottom of that page I think there is a regex that will find only correct XML tags; invert that to find poorly formed?

于 2010-04-27T20:04:54.703 に答える
0

XML::Liberalを見てください。それはあなたが望むことだけをするようです。非常に単純な例 (単体テストの 1 つから):

my $clean_xml = XML::Liberal->new('LibXML')->parse_string($bad_xml)->to_string()
于 2010-04-27T20:40:18.253 に答える