0

NSXMLParserを使用して、次のようなXMLファイルを解析しようとしています。

<?xml version="1.0" encoding="us-ascii"?>
<teams>
    <team id = "A1">
        <player1>John</player1>
        <player2>José</player2>
    </team>
    ...
</teams>

私は次のコードを使用します:

NSString *urlString = [NSString stringWithFormat:@"http://www....abc.php?category=%@&poule=%c", @"S", 'B'];  // Obviously, this contains an actual web address
NSURL *url = [NSURL URLWithString:urlString];
NSData *xml = [[NSData alloc] initWithContentsOfURL:url];   // <==
NSXMLParser *xmlParserObject = [[NSXMLParser alloc]initWithData:xml];
[xmlParserObject setDelegate:self];
[xmlParserObject parse];

そして、didStartElement、foundCharacters、didEndElement、およびparserErrorOccurredデリゲート関数を実装しました。

これはすべて、éなどの「特殊」文字に遭遇するまでうまくいきます。デリゲートメソッドparserErrorOccurredは、次のエラーを報告します。

parser error: Error Domain=NSXMLParserErrorDomain Code=1544 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 1544.)"
parser error: Error Domain=NSXMLParserErrorDomain Code=5 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 5.)"

次に、「<==」でマークされた部分を次のように置き換えました。

NSError *error;
NSData *xml = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (xml == nil) {
    NSLog(@"*** Fatal error: %@\nuserInfo:%@", error, [error userInfo]);
}

上記のエラーに加えて、次のエラーが発生しました。

 *** Fatal error: Error Domain=NSCocoaErrorDomain Code=261 "The operation couldn’t be completed. (Cocoa error 261.)" UserInfo=0x8158d90 {NSURL=http://www....abc.php?category=S&poule=B, NSStringEncoding=4}
userInfo:{
    NSStringEncoding = 4;
    NSURL = "http://www....abc.php?category=S&poule=B";
}

また、NSUTF8StringEncodingを、NSISOLatin1StringEncoding、NSUTF16StringEncoding、NSASCIIStringEncoding、NSUnicodeStringEncodingなどの他のエンコーダーに置き換えてみました。これにより、次のエラーが発生しました。

 -[__NSCFString bytes]: unrecognized selector sent to instance 0x6e4cbc0
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x6e4cbc0'
*** First throw call stack:
(0x12d0022 0x1781cd6 0x12d1cbd 0x1236ed0 0x1236cb2 0xce5f51 0xb447 0xaa89 0x1f2e330 0x1f2f439 0x908b9b24 0x908bb6fe)
terminate called throwing an exception(lldb) 

XMLの内容を制御することはできませんが、実際に誤った情報が含まれている場合は、Webマスターに相談することができます。

é文字を「e」または「?」として表示しても問題ありません。それが必要な場合。

このエラーの原因と、エラーを修正またはバイパスする方法についてのアドバイスをいただければ幸いです。

Tx!

--GB

4

2 に答える 2

0

私はこの問題へのバイパス(解決策ではない)を見つけました。NSURLからNSDataに移動するために、次のコードを使用しました。

        NSError *error;
        NSString *xmlText = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];
        xmlText = [xmlText stringByReplacingOccurrencesOfString:@"é" withString:@"e"];
        NSData *xml = [xmlText dataUsingEncoding:NSASCIIStringEncoding];

だから基本的に、私は

  • NSStringでNSURLを変換しました
  • '特殊'文字を置き換えることによってその文字列を編集しました
  • 編集した文字列を使用してNSDataを作成しました

また、NSUTF8StringEncodingの代わりにNSASCIIStringEncodingを使用する必要があることもわかりました(これはXMLで指定されていますが、以前は失敗しました)。

とにかく、問題を本当に解決するための提案はまだ歓迎されていますが、このバイパスは当分の間私にとってはうまくいきます...

于 2012-06-27T16:02:03.960 に答える
0

無効なutf-8文字の場合は、NSXMLParserに処理する前に、ソースから受信したデータを「クリーンアップ」することをお勧めします。NSXMLParserを処理するときによく提案されるように、データをASCIIに変換することは、たとえばソースにキリル文字が含まれている場合など、必ずしも良い考えではありません。

Swiftでは、次のように実行できます。

var buffer = data // malformed UTF-8
buffer.append(0 as UInt16)
let cleanBuffer = buffer.withUnsafeBytes { (p: UnsafePointer<CChar>) in String(cString: p) }
let cleanString = cleanBuffer.replacingOccurrences(of: "\u{FFFD}", with: String())
let cleanData = clean.data(using: String.Encoding.utf8) {
   self.parser = XMLParser(data: cleanData) // Assuming a 'parser' variable is already present
}

不正な形式のUTF8文字列のクリーニングに基づく

于 2018-04-01T12:17:19.973 に答える