【问题标题】:TBXML Issue when parsing textForElement解析 textForElement 时出现 TBXML 问题
【发布时间】:2011-06-08 08:40:41
【问题描述】:

我在使用 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标签有不止一个文字,

确实,如果我使用相同的函数来获取 另一个没有 PARTIALS 标签的 STEP , 字符串正确,不为空!

我是这样走的:

NSstring *_step = [TBXML textForElement:step];

有解决这个问题的想法吗?

谢谢。

编辑:此 XML 有效。它已经使用了多年。只是从原件复制的一部分,很长,无法粘贴到这里。

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

【问题讨论】:

  • 在有效的 XML 中,每个属性值都必须被引用。
  • @Bavarious 我的问题是文本解析,而不是 XML 的有效性。从服务器出来时有效!
  • 它的解析器问题..我相信他们没有处理它。最好你把那个字符串放在一个标签中。或者你必须通过他们的逻辑。
  • 我无法更改此 xml

标签: iphone objective-c xml ipad


【解决方案1】:

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

【讨论】:

  • 此 XML 有效。它已经使用了多年。只是从原件复制的一部分,很长,无法粘贴到这里。
  • 它可以使用多年,但它不是有效的 XML。
【解决方案2】:

让我用一个简单的例子来解决你的问题,我从 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; 如果(根XML元素) { 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>

【讨论】:

  • @Simon 你的起始标签是,结束标签是,它如何有效???
  • 如果你的 xml 相似,但 TEXT[...] 你如何获得 TEXT?
  • 我认为.. 在 XML 中会有 而不是
  • 好的,但这不重要!我需要得到“这个字符串没有被解析”而不是对有效 XML 的更正(这是有效的,但不是这个)!
【解决方案3】:

临时修补为空行使用另一个解析器。
我正在使用来自XPathQuery.h/.mPerformXMLXPathQuery()

有效!

...并且 XML 是正确的并且 通过 W3C 验证 NO ERRORS

来自 validator.w3.org 的报告

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

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

谢谢。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2013-03-29
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多