【问题标题】:Parse child elements with TBXML使用 TBXML 解析子元素
【发布时间】:2011-11-16 07:21:17
【问题描述】:

我的 XML 如下所示:

<root>
<sets>
    <childSets>
        <childs>
            <child>
                <childId>11</childId>
        </child>
        <child>
            <childId>22</childId>
        </child>
        <child>
            <childId>33</childId>
        </child>
        <child>
            <childId>44</childId>
        </child>
[...]
    </childs>
</childSets>

    <childSets>
[...]
    </childSets>
</sets>
</root>

我想解析child 的所有childId 元素。

其实我解析的结果只是每个childs元素的第一个childId

[...]
do {
  if ([[TBXML elementName:element] isEqualToString:@"childSet"]) {
  [...]
        TBXMLElement *xmlChildId        = [TBXML childElementNamed:@"childId"           parentElement:child];
  [...]
  }
} while ((element = element->nextSibling));  
[...]

在这种情况下,我只得到11。这里有什么问题?

编辑 1:

解决办法是找到子元素的第一个子元素,并解析this的下一个元素,这里是:

这段代码在方法traverseElement的do while循环中

do { [...]
        if ([[TBXML elementName:element] isEqualToString:@"childSet"]) {
        //find the first child
            if ((ChildPARENTELEMENT->firstChild)) {

            while (ChildOfCHILDELEMENT!=nil) {
                NSLog(@"....");

                 ChildOfCHILDELEMENT = [TBXML nextSiblingNamed:@"childs" searchFromElement:ChildOfCHILDELEMENT];

            }
        }
    }
while((element = element->nextSibling));

【问题讨论】:

  • 是的,第二个 do while 使应用程序崩溃。我不知道如何解决第二个循环。你能给我一个建议吗?
  • 请提供有关您看到的错误的更多信息。你得到一个 SIGABRT 吗?应用程序是否在没有日志/调试信息的情况下关闭?如果有调试信息,哪条线路崩溃了,错误信息是什么?
  • 你好 Sam,谢谢你的帮助,我已经包含了我的解决方案,我昨天晚上解决了 :) 我不记得它是 SIGABRT 还是 EXC_BAD_ACCESS 但错误出现在第二个循环条件中。

标签: ios tbxml


【解决方案1】:

解决方法是找到子元素的第一个子元素,并解析this的下一个元素,这里是:

这段代码在方法traverseElement的do while循环中

do { [...]
    if ([[TBXML elementName:element] isEqualToString:@"childSet"]) {
    //find the first child
        if ((ChildPARENTELEMENT->firstChild)) {

        while (ChildOfCHILDELEMENT!=nil) {
            NSLog(@"....");

             ChildOfCHILDELEMENT = [TBXML nextSiblingNamed:@"childs" searchFromElement:ChildOfCHILDELEMENT];

        }
    }
}
while((element = element->nextSibling));

【讨论】:

    【解决方案2】:

    您需要一个遍历所有子 xml 元素的内部循环。 childElementName:parentElement: 将只返回具有该名称的第一个孩子。

    尝试类似:

    [...]
    do {
       if ([[TBXML elementName:element] isEqualToString:@"childSet"]) {
          [...]
          TBXMLElement *xmlChildId = [TBXML childElementNamed:@"childId" 
                                                parentElement:child];
          do {
             // Do nslog or whatever else on xmlChildId
             [...]
    
             // Find next child element to process
             xmlChildId = [TBXML nextSiblingName:@"childId" 
                               searchFromElement:xmlChildId];
          } while (xmlChildId != nil);
       }
    } while ((element = element->nextSibling));  
    [...]
    

    【讨论】:

    • 这对您有帮助吗?如果没有,请分享更多代码。里面有很多[...]。
    • 不,它没有帮助。循环使应用程序崩溃。 [...] 是日志和与其他子元素相同的解析行。
    • 你给了我正确的建议,非常感谢。我已经解决了,我的代码就在那里。再次感谢。
    • 您可以发布您的解决方案并将其标记为答案吗?可以发布您自己问题的答案并将其标记为答案(请参阅FAQ)。这有助于其他有相同问题的人更容易地确定解决方案。很高兴你把一切都解决了:)
    • 如果其他人有类似的问题:我有一个有效的 Do/While 循环 - 但前提是在我想从中提取数据的区域下方没有额外的 XML 数据 - 如果有应用程序会以 nil 值轰炸(它不断循环并使用下一个值)。添加内部 IF TBXML 元素 isEqualToString:@"myString" 停止了崩溃。谢谢
    猜你喜欢
    • 2013-07-10
    • 2013-03-29
    • 2014-06-03
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多