TBXML解析textForElement时出现的问题
我使用TBXML
时遇到了一个很大的问题。TBXML解析textForElement时出现的问题
当我使用:
+ (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标签有一个以上的文字,
事实上,如果我用同样的功能来获得 又迈进了一步不谐音标签, 字符串是正确的,不空!
我得到的步骤以这样的方式
NSstring *_step = [TBXML textForElement:step];
任何想法来解决这个问题?
谢谢。
编辑:这个XML是有效的。它被使用了多年。只是从mooore的原始复制部分粘贴到这里。
编辑2:我手写这段代码,可能省略引号或别的东西,但xml是有效的。
临时修补使用其他解析器行空。
我使用PerformXMLXPathQuery()
从XPathQuery.h/.m
它的工作原理!
...和XML是正确的, 验证与W3C与NO错误!
报告从validator.w3.org:
该文件已成功签 作为格式良好的XML!
结果:合格,1个警告
如果有一个更好的解决方案,而不是这个补丁,我改变与正确回答正确的答案。
谢谢。
该XML不是有效的XML,因此您将遇到问题。同样的事情也适用于libxml2(我知道我有同样的问题)。
此XML有效。它被使用了多年。只是从mooore的原始复制部分粘贴到这里。 – elp 2011-06-08 08:50:37
它可能会使用多年,但其无效的XML。 – 2011-06-08 08:51:35
让我清楚你的问题简单的例子,我从TBXML
如果你想解析XML类似forum了,
<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.  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];如果(rootXMLElement) node_alert = [TBXML childElementNamed:
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:@" " 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与
我认为..会有
在有效的XML中,必须引用每个属性值。 – 2011-06-08 08:55:00
@Bavarious我的问题是文本解析,而不是XML的有效性。从服务器出来时这是有效的! – elp 2011-06-08 09:21:02
它的解析器问题..他们没有处理它我相信。它最好你把这个字符串放在一个更多的标记。或UL必须通过他们的逻辑。 – Priyanka 2011-06-08 10:31:18