我有以下帮助函数,用于通过XSLT转换XML:
- (NSXMLDocument *)transform:(NSString *)xml :(NSString *)xslt
{
NSError *xmlDocErr = nil;
NSXMLDocument *transformedXmlDoc = nil;
NSXMLDocument *xmlDoc = [[NSXMLDocument alloc]
initWithXMLString:xml
options:NSXMLDocumentValidate
error:&xmlDocErr];
if (xmlDocErr) {
NSLog(@"Error: %@", [xmlDocErr localizedDescription]);
}
else {
transformedXmlDoc = [xmlDoc objectByApplyingXSLTString:xslt
arguments:nil
error:&xmlDocErr];
if (xmlDocErr) {
NSLog(@"Error: %@", [xmlDocErr localizedDescription]);
}
}
return transformedXmlDoc;
}它可以像预期的那样工作,但有一个小小的怪癖,我需要帮助。
当我尝试使用NSXMLDocument所不知道的XSLT函数(例如,EXSLT的node-set())时,我会得到类似于下面所示的Xcode输出--尤其是第一行是有意义的:
xmlXPathCompOpEval:未找到函数节点集 XPath错误:未注册函数运行时 错误:-每个元素 未能计算“select”表达式。
这很酷,这正是我所期望的。
然而,对我来说有趣的是,输出不包含"Error: "在任何地方(如果输出已经被[xmlDocErr localizedDescription]调用捕获的话)。
因此,这里有一个问题:如何获取上面的输出(以便我可以使用它向我的用户显示相关消息)?
非常感谢!
发布于 2013-04-22 07:43:32
这个错误发生在libxml内部,xpath.c的第13479行,最后在error.c的第71行调用xmlGenericErrorDefaultFunc(),然后打印到stderr。因此,最简单的方法是在XSLT处理过程中捕获stderr:
- (NSXMLDocument *)transform:(NSString *)xml :(NSString *)xslt
{
NSError *xmlDocErr = nil;
NSXMLDocument *transformedXmlDoc = nil;
NSXMLDocument *xmlDoc = [[NSXMLDocument alloc]
initWithXMLString:xml
options:NSXMLDocumentValidate
error:&xmlDocErr];
if (xmlDocErr) {
NSLog(@"Error: %@", [xmlDocErr localizedDescription]);
}
else {
// Pipe for stderr
NSPipe *pipe = [NSPipe pipe];
// Duplicate of stderr (will use later)
int cntl = fcntl(STDERR_FILENO,F_DUPFD);
// Redirect stderr through our pipe
dup2([[pipe fileHandleForWriting] fileDescriptor], STDERR_FILENO);
transformedXmlDoc = [xmlDoc objectByApplyingXSLTString:xslt
arguments:nil
error:&xmlDocErr];
// Get the data
NSData *dat = [[pipe fileHandleForReading] availableData];
// Redirect stderr through our duplicate, to restore default output behavior
dup2(cntl, STDERR_FILENO);
// Did anything get logged?
if ([dat length]>0) {
NSLog(@"Error: %@", [[NSString alloc] initWithData:dat encoding:NSASCIIStringEncoding]);
}
if (xmlDocErr) {
NSLog(@"Error: %@", [xmlDocErr localizedDescription]);
}
}
return transformedXmlDoc;
}但这是个小问题,所以要小心.
如果您对该解决方案不满意,应该可以通过使用xmlGenericError的自定义错误处理函数(在默认情况下引用xmlGenericErrorDefaultFunc)覆盖变量initGenericErrorDefaultFunc (在xmlerror.h的第864行使用initGenericErrorDefaultFunc)。这样做会安全得多,但也会更复杂(如果有可能的话)。
https://stackoverflow.com/questions/16064718
复制相似问题