【问题标题】:Problem processing XML data with TBXML使用 TBXML 处理 XML 数据时出现问题
【发布时间】:2011-08-11 23:00:06
【问题描述】:

我必须连接一个 .NET Web 服务,但很遗憾,我无法更改该 Web 服务。我使用 NSURLConnection 构建了 Web 服务调用,并且收到了很好的响应。

我从 Web 服务调用中获取 NSData 对象,当调用 connectionDidFinishLoading 方法时,我将数据写入文件。这也很好用,没有问题。

我获取文件路径并将其加载到 TBXML 类中。当我尝试通过 initWithXMLFile 加载它时,它实际上从未从文件中返回数据。我将文件加载到 NSData 对象中并使用 initWithXMLData 并且加载正常。

问题发生在我实际处理文件时。首先,我得到根元素,然后解析出额外的 SOAP 标头。当我进入嵌套的数据片段时,我会设置循环来处理它们。

TBXMLElement *root = parser.rootXMLElement;
if (root) {
    TBXMLElement *soapBody = [TBXMLElement childElementNamed:@"soap:Body" parentElement:root];
    TBXMLResponse *serviceResponse = [TBXMLElement childElementNamed:@"GetServiceResponse" parentElement:soapBody];
    ... more code like this ...
    TBXMLElement *mainObject = [TBXML childElementNamed:kMainObject parentElement:parentObject];
    while (mainObject != nil) {
        TBXMLElement *element1 = [TBXML childElementName:kElement1 parentElement:mainObject];
        object.value1 = [TBXML textForElement:element1];
        ... more nesting and value getting like this ...
        mainObject = [TBXML nextSiblingName:kMainObject searchFromElement:mainObject];
    }
}

我的数据如下所示:

< ... soap stuff ... >
<mainObject>
    <element> ... </element>
    <element> ... </element>
    <element> ... </element>
    <childObjects>
        <childObject> ... </childObject>
        <childObject> ... </childObject>
        <childObject> ... </childObject>
    </childObject>
</mainObject>

因此,为了处理 childObject 元素周围的包装器(标签),我只需拉出 childObjects 元素,然后为嵌套在该元素中的所有内容设置一个循环。喜欢:

// Go into the childObjects wrapper
TBXMLElement *childObjectsWrapper = [TBXML childElementNamed:kChildObjectsWrapper parentElement:parent];
// Get the first childObject element
TBXMLElement *childObject = [TBXML childElementNamed:kChildObject parentElement:parent];
while (childObject != nil) {
    ... process the nested elements ...

    childObject = [TBXML nextSiblingNamed:kChildObject searchFromElement:childObject];
}

10 次中有 1 次,一切正常。但是,10 次中有 9 次在 TBXML 库的 childElementNamed 函数中引发 EXC_BAD_ACCESS。它阻塞的 XML 部分是可变的。 60% 的时间,它是一个特定的元素。 40% 的时间是其他元素的随机组合。

加载包装对象后,TBXMLElement *childObject 定义发生异常。我确定它与包装器对象有关,因为在 childElementNamed: 方法中,aParentXMLElement 为空。但是,正如解析器所期望的那样,数据在 XML 文件中,并且有时可以工作。而且我得到的数据总是一样的。

对诊断有帮助吗?我迷路了……

【问题讨论】:

    标签: iphone xml ios ipad tbxml


    【解决方案1】:

    您是否考虑过转而使用一些用于 Objective-C 的标准 SOAP 库:

    How to access SOAP services from iPhone

    从头开始编写自己的 SOAP 处理程序要容易得多。

    【讨论】:

    • 是的,但这并不是问题的真正原因。 SOAP 代码可以正常工作并且可以很好地写入文件。问题出在解析中。
    • 使用 SOAP 的全部困难在于解析 SOAP 信封并将请求的正确 SOAP 包装放在一起......我担心的是,如果您从一开始就看到解析问题,那么您有有更多问题摆在你面前的道路......
    【解决方案2】:

    这个问题原来是一个 XML 问题。 TBXML 库正在读取的数据有一些转义的特殊字符,尤其是 &。为了解决这个问题,我获取 NSData 对象,将其转换为字符串,使用 Google 的字符转义类对 & 进行 UNEscape,然后将其重写为 NSData 对象。那时我可以解析字符串,但我已经为 NSData 设置了解析器,所以我暂时保持这种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2021-12-17
      • 2012-11-12
      相关资源
      最近更新 更多