首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收集NSXMLDocument警告输出

收集NSXMLDocument警告输出
EN

Stack Overflow用户
提问于 2013-04-17 15:54:20
回答 1查看 365关注 0票数 2

我有以下帮助函数,用于通过XSLT转换XML:

代码语言:javascript
复制
- (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函数(例如,EXSLTnode-set())时,我会得到类似于下面所示的Xcode输出--尤其是第一行是有意义的:

xmlXPathCompOpEval:未找到函数节点集 XPath错误:未注册函数运行时 错误:-每个元素 未能计算“select”表达式。

这很酷,这正是我所期望的。

然而,对我来说有趣的是,输出不包含"Error: "在任何地方(如果输出已经被[xmlDocErr localizedDescription]调用捕获的话)。

因此,这里有一个问题:如何获取上面的输出(以便我可以使用它向我的用户显示相关消息)?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-22 07:43:32

这个错误发生在libxml内部,xpath.c的第13479行,最后在error.c的第71行调用xmlGenericErrorDefaultFunc(),然后打印到stderr。因此,最简单的方法是在XSLT处理过程中捕获stderr

代码语言:javascript
复制
- (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)。这样做会安全得多,但也会更复杂(如果有可能的话)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16064718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档