使用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是有效的。
答案 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.  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:@" " 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个警告
如果有一个更好的解决方案而不是这个补丁,我会用正确的回复更改正确答案。
感谢。