【问题标题】:NSXMLParserErrorDomain 111NSXMLParserErrorDomain 111
【发布时间】:2013-12-25 15:09:18
【问题描述】:

下面的代码正在打印以下消息:Error Domain=NSXMLParserErrorDomain Code=111 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 111.)

mainUrl = [NSURL URLWithString:@"http://www.carris.pt/pt/carreiras"];
NSString *urlContents = [NSString stringWithContentsOfURL:mainUrl encoding:NSISOLatin1StringEncoding error:nil];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[urlContents dataUsingEncoding:NSISOLatin1StringEncoding]];
[xmlParser parse];
NSLog(@"%@", [xmlParser parserError]);

有人知道吗?从代码中可以看出,html 采用 ISO-8859-1 编码。

更新:我将 url 提交到 html 验证器站点:http://validator.w3.org/,它发现了 30 多个错误。我认为这与错误有关。但我可以用 HPPLE 解析 html。

【问题讨论】:

  • 我看到它在解析带有无效 UTF-8 字符的 CDATA 标记时弹出。

标签: ios objective-c nsxmlparser nsxmlparsererrordomain


【解决方案1】:

我最近遇到了同样的错误,发现问题是无效的 XML 标签。前端代码没有错误,但问题出在后端站点。 为了说明,我收到的 XML 数据是这样的:

    <TABLE>
      <item>
           <0>memo</0>
           <1>179</1>
      </item>
    </TABLE>

在尝试解析名称标签为 0 或 1 的元素时出现错误 (NSXMLParseErrorDomain=111)。然后我在后端更改了这样的 XML;

    <TABLE>
     <item>
        <name>memo</name>
        <weight>179</weight>
     </item>
    </TABLE>

然后解析工作完美,因为以前的 XML 具有无效的标记名称。

【讨论】:

    【解决方案2】:

    似乎还没有人偶然发现正确答案,所以就在这里。

    NSXMLParserError docs 中,它说:

    以下错误代码由 NSXMLParser 定义。对于此处未列出的错误代码,请参阅 头文件。

    这个列表中没有提到数字111,所以我们去/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2/libxml/xmlerror.h,找到值:

    XML_ERR_USER_STOP, /* 111 */
    

    在 libxml2 中没有很多关于 XML_ERR_USER_STOP 的文档,但是从 reading the changeset 来看,当解析器看到意外的 EOF 时,它似乎是一个快速失败。

    【讨论】:

      【解决方案3】:

      解析时我也有“111”(未记录?)错误代码。事实证明,XML 解析器希望 XML 格式正确(例如,一个根节点包含所有其他节点)。

      【讨论】:

      • +1,我发现我没有结束标签,所以我的 XML 格式也不正确。
      • 我使用xmlvalidation.com 找到了我的问题,这绝对是一些格式不正确的可疑 XML!
      【解决方案4】:

      我在解析 XML 时遇到了类似的情况。问题可能是您使用的编码。尝试 UTF8 编码而不是 iOSLatin 即

      NSString *urlContents = [NSString stringWithContentsOfURL:mainUrl encoding:NSUTF8StringEncoding error:nil];
      NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[urlContents dataUsingEncoding:NSUTF8StringEncoding]];
      

      【讨论】:

      • 我试过了,我得到了Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn’t be completed. (Cocoa error -1.)" UserInfo=0x8a50420 {NSXMLParserErrorMessage=Could not open data stream}
      【解决方案5】:

      如果您查看NSXMLParser.h,您会看到错误代码列表:

      NSXMLParserInternalError = 1,
      NSXMLParserOutOfMemoryError = 2,
      NSXMLParserDocumentStartError = 3,
      NSXMLParserEmptyDocumentError = 4,
      NSXMLParserPrematureDocumentEndError = 5,
      NSXMLParserInvalidHexCharacterRefError = 6,
      NSXMLParserInvalidDecimalCharacterRefError = 7,
      NSXMLParserInvalidCharacterRefError = 8,
      NSXMLParserInvalidCharacterError = 9,
      NSXMLParserCharacterRefAtEOFError = 10,
      NSXMLParserCharacterRefInPrologError = 11,
      NSXMLParserCharacterRefInEpilogError = 12,
      ...
      

      所以它看起来像是一个NSXMLParserCharacterRefInPrologError,它在“常量”部分in the documentation 中定义。它说:

      NSXMLParserCharacterRefInPrologError 在序言中发现无效字符。 在 iOS 2.0 及更高版本中可用。 在 NSXMLParser.h 中声明。

      【讨论】:

      • 那么代码 111 应该是 11 吗?我注意到文档中没有定义 111,这对我来说可能是这种情况。
      • 这是我的猜测。要么是这样,要么是 Apple 没有发布的一些内部错误。
      • 这不是正确的答案,111 更可能是由于 XML 格式不正确造成的。使用xmlvalidation.com 帮助我找到了我的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多