解析textForElement时出现TBXML问题

时间:2011-06-08 08:40:42

标签: iphone objective-c xml ipad

使用TBXML时出现了一个大问题。

当我使用时:

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement {
    if (nil == aXMLElement->text) return @"";
    return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding];
}

解析此XML

[...]
<step id=123>this string is not parsed
  <draw_at x="1964"/>
  <partials>
    <partial sd="23">
      <line>ANOTHER TEXT 1</line>
      <line>ANOTHER TEXT 2</line>
    </partial>
  </partials>
</step>
[...]

我收到 EMPTY 字符串。

我想这是因为STEP标签有多个文本,

  

确实如果我使用相同的功能来获取   另一个STEP 没有PARTIALS标记,   字符串是正确的,不是空的!

我这样做了一步:

NSstring *_step = [TBXML textForElement:step];

有什么想法解决这个问题?

感谢。

编辑:此XML有效。它已被使用多年。只是一部分复制了原来的mooore很长时间粘贴在这里。

编辑2 :我手写这个片段,可能省略了引号或其他内容,但xml是有效的。

3 个答案:

答案 0 :(得分:1)

该XML不是有效的XML,因此您将遇到问题。同样的事情也适用于libxml2(我知道因为我有同样的问题)。

答案 1 :(得分:0)

让我用简单的例子清楚你的问题,我来自TBXML的forum

如果要解析XML之类的内容,

<xml> 
<alert id="b19260fa7f00000100258097dcd87ab7">
    <title>MU-Lancaster Now Open</title>
    <startdate>1304353800</startdate>
    <enddate>1304362800</enddate>
    <type>Emergency</type>
    <message>
        <p>MU-Lancaster, at 42 N. Prince St., in Lancaster, is now open.&#160; It had been closed this morning due to the evacuation of downtown Lancaster.</p>
    </message>
</alert> 

您需要编写用于解析的代码,如下所示,

- (void)parseMuAlertXML{
TBXML *tbxml;
TBXMLElement *rootXMLElement;
TBXMLElement *node_alert;
TBXMLElement *node_message;
TBXMLElement *node_traverse;

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

NSURL *url = [NSURL URLWithString:@"http://www.millersville.edu/alert/alert.xml"];

tbxml = [TBXML tbxmlWithURL:url];

rootXMLElement = tbxml.rootXMLElement;     如果(rootXMLElement)     {         node_alert = [TBXML childElementNamed:@“alert”parentElement:rootXMLElement];

    if(node_alert)
    {
        node_traverse = [TBXML childElementNamed:@"startdate" parentElement:node_alert];
        NSInteger startString =  [[TBXML textForElement:node_traverse] intValue];
        time_t startTime = startString;

        node_traverse = [TBXML childElementNamed:@"enddate" parentElement:node_alert];
        NSInteger endString =  [[TBXML textForElement:node_traverse] intValue];
        time_t endTime = endString;

        node_traverse = [TBXML childElementNamed:@"type" parentElement:node_alert];
        alertType = [[TBXML textForElement:node_traverse] retain];

        node_message = [TBXML childElementNamed:@"message" parentElement:node_alert];

        if(node_message)
        {
            node_traverse = [TBXML childElementNamed:@"p" parentElement:node_message];
            alertMessage = [TBXML textForElement:node_traverse];
            alertMessage = [alertMessage stringByReplacingOccurrencesOfString:@"&#160;" withString:@" "];
        }

        if((unixTime >= startTime) && (unixTime <= endTime))
        {
            [alertButton setHidden:NO];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        } else {
            [alertButton setHidden:YES];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        }
    }
}

}

你的xml也是无效的xml, 我认为你的xml会是,

<step id="123"> this string is not parsed<draw_at x="1964"/><partials><partial sd="23"><line>ANOTHER TEXT 1</line><line>ANOTHER TEXT</line></partial></partials></step>

答案 2 :(得分:0)

临时修补使用另一个解析器为空行。
我正在使用PerformXMLXPathQuery()

中的XPathQuery.h/.m

有效!

  

... XML是正确的   使用无错误验证W3C

来自 validator.w3.org的报告

  

此文档已成功检查   格式良好的XML!
  结果:通过,1个警告

如果有一个更好的解决方案而不是这个补丁,我会用正确的回复更改正确答案。

感谢。