0

私はこのスタック トレースにやや混乱しています (紛らわしい部分のみが示されています)。

-[NSXMLDocument length]: unrecognized selector sent to instance 0x10187e010
An uncaught exception was raised
-[NSXMLDocument length]: unrecognized selector sent to instance 0x10187e010
(
   0   CoreFoundation                      0x00007fff8f5d6286 __exceptionPreprocess + 198
   1   libobjc.A.dylib                     0x00007fff9213bd5e objc_exception_throw + 43
   2   CoreFoundation                      0x00007fff8f6624ce -[NSObject doesNotRecognizeSelector:] + 190
   3   CoreFoundation                      0x00007fff8f5c3133 ___forwarding___ + 371
   4   CoreFoundation                      0x00007fff8f5c2f48 _CF_forwarding_prep_0 + 232
   5   CoreFoundation                      0x00007fff8f548c66 CFDataGetLength + 118
   6   CoreFoundation                      0x00007fff8f5791df CFStringCreateFromExternalRepresentation + 31
   7   asLJ                                0x0000000100013828 +[stripHTML stripAllHtmlFromString:] + 212

特に、 への呼び出しがどこで行われてCFStringCreateFromExternalRepresentationいるかがわからないため、コード ( +[stripHTML stripAllHtmlFromString:]) のどの部分が例外を引き起こしているのかわかりません。への呼び出しの原因は何CFStringCreateFromExternalRepresentationですか? 明らかな場合、例外を引き起こしているのは何が間違っているのですか? 将来、何が呼び出されているかを判断するにはどうすればよいCFStringCreateFromExternalRepresentationですか?

ここにあり+[stripHTML stripAllHtmlFromString:]ます:

+ (NSString *)stripAllHtmlFromString:(NSString *)inputString
{
    // based on code from http://sugarmaplesoftware.com/25/strip-html-tags/#comment-71

    NSError *theError = NULL;
    NSString *modifiedInputString = [NSString stringWithFormat:@"%@\n\n\n\n\n\n\n\n\n\n\n\n",inputString]; // adding some spare newlines at the end to ensure that things will work even with a short non-HTML string
    NSXMLDocument *theDocument = [[NSXMLDocument alloc] initWithXMLString:modifiedInputString
                                                                  options:NSXMLDocumentTidyHTML
                                                                    error:&theError];

    NSString *theXSLTString = @"<?xml version='1.0' encoding='utf-8'?>"
                                "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xhtml='http://www.w3.org/1999/xhtml'>"
                                "<xsl:output method='text'/>"
                                "<xsl:template match='xhtml:head'></xsl:template>"
                                "<xsl:template match='xhtml:script'></xsl:template>"
                                "</xsl:stylesheet>";    
    NSData *theData = [theDocument objectByApplyingXSLTString:theXSLTString arguments:NULL error:&theError];
    [theDocument release];
    return [[[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding] autorelease];
}
4

2 に答える 2

3

ああ、実際には、おそらく ではなく が-objectByApplyingXSLTString:arguments:error:返されました。したがって、 への呼び出しは、 であると思われるものを呼び出していますが、それを認識しません。NSXMLDocumentNSData-[NSString initWithData:encoding:]-lengthNSDataNSXMLDocument

于 2012-05-20T00:06:17.053 に答える
0

Ken Thomases の答えはまさに正しいようです。何らかの理由で、非常に短い入力 (特に空の文字列) の場合-objectByApplyingXSLTString:arguments:error:、指定された XSLT はNSXMLDocument(そうあるべきではないと思いますが) を返します。これを修正するには、まず を取得したかどうかを検出し、取得したNSXMLDocument場合はそれを XML の文字列表現に変換し、それをメソッドにフィードバックします。それ以外の場合は、最初に期待したものを取得したと仮定しNSDataます。

指定されたメソッドの最後の 3 行 (from NSData *theData =... on) を以下のコードに置き換えると、問題が修正されたようです。

// Had a report of an exception that seemed to indicate objectByApplyingXSLTString:arguments:error: was returning an NSXMLDocument objectinstead of an NSData object, so let's guard against that.  (discussed at https://stackoverflow.com/q/10669479/291280 )
NSObject *XSTLresult = [theDocument objectByApplyingXSLTString:theXSLTString arguments:NULL error:&theError];
[theDocument release];
if ([XSTLresult isKindOfClass:[NSXMLDocument class]]) {
    // If the result is an NSXMLDocument, call XMLData to get an NSData object, turn it into a string, and feed that back into this method...
    return [self stripAllHtmlFromString:[[[NSString alloc]
                                          initWithData:[(NSXMLDocument *)XSTLresult XMLData]
                                          encoding:NSUTF8StringEncoding]
                                         autorelease]
            ];
} else {
    // Otherwise, assume we have an NSData object.
    return [[[NSString alloc] initWithData:(NSData *)XSTLresult encoding:NSUTF8StringEncoding] autorelease];
}
于 2012-05-20T05:16:00.777 に答える