gpt4 book ai didi

objective-c - 收集 NSXMLDocument 警告输出

转载 作者:行者123 更新时间:2023-12-03 16:41:59 25 4
gpt4 key购买 nike

我有以下帮助函数用于通过 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 函数(例如 EXSLTnode-set() )时,我在 Xcode 中得到类似于以下的输出 - 特别是第一行很有趣:

xmlXPathCompOpEval: function node-set not found

XPath error: Unregistered function runtime

error: element for-each

Failed to evaluate the 'select' expression.

那很酷;这正是我所期望的。

然而,对我来说有趣的是,输出在任何地方都不包含 "Error: " (如果该输出已被我的 [xmlDocErr 捕获,则应该是这种情况) localizedDescription] 调用)。

所以,问题是:如何获取上述输出(以便我可以使用它向用户显示相关消息)?

非常感谢!

最佳答案

错误发生在 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) -使用 xmlerror.h 第 864 行上的 initGenericErrorDefaultFunc 处理您自己的函数。这会更安全,但也更复杂(如果可能的话)。

关于objective-c - 收集 NSXMLDocument 警告输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com