0

我正在尝试使用 GdataxmlNode 目标 c 库解析一个巨大的 xml 文档(描述 3d 模型)。

这是阻止我的 XML 示例:

<library_effects>
    <effect name="Love_Love-fx" id="Love_Love-fx">
        <profile_COMMON>
            <newparam sid="sexy-surface">
                <surface type="2D">
                    <init_from>sexy</init_from>
                    <format>A8R8G8B8</format>
                </surface>
            </newparam>
            ....
        </profile_COMMON>
    </effect>
    ....
</library_effects>

我的目标

  1. 获得效果名称 (*Love_Love-fx*) : 完美

  2. 获取 init_from ( sexy ) 的内容:根本不起作用

这是我解析它的方式:

xmlGetData = [xmlDoc.rootElement elementsForName:@"library_effects"];   

//Effects infos
int eff_c;
NSMutableArray *eff_ids = [[NSMutableArray alloc] init];  //effect names
NSMutableArray *eff_src = [[NSMutableArray alloc] init];  //efects sources

for (GDataXMLElement *e in xmlGetData)
{
    eff_c = [[e elementsForName:@"effect"]count];        
    NSArray *eff_node  = [e elementsForName:@"effect"];
    for (int i = 0; i < eff_c; i++)
    {
        //get the effect name (id & name are the same)
        [eff_ids addObject:[[eff_node objectAtIndex:i]attributeForName:@"id"]];
        //get the content of init_from
        [eff_src addObject:[[eff_node objectAtIndex:i]elementForName:@"init_from"]];
    }
}

我的问题:我在最后一行 ( [eff_src addObject.........) 上有一个 SIGABRT,所以我无法获取“init_from”的内容

(因为[[eff_node objectAtIndex:i]elementForName:@"init_from"]]返回 Nil。?)

有人可以帮我吗?(有没有清晰完整的文档?我只看到博客文章解释了其中的一部分)

恶心的解决方案:使用[[[[[[eff_node objectAtIndex:i]childAtIndex:0]childAtIndex:0]childAtIndex:0]childAtIndex:0]stri‌​ngValue];

4

1 回答 1

1

eff_node是 XML 节点effect。我的猜测是该elementForName:方法不能递归工作并且返回 nil 因为init_from不是effect.

要么是这样,要么你effect的 XML 中有没有init_from包含在其中的节点的 s。

基本上,您不能将 nil 添加到 an 中,NSMutableArray因此您需要测试您的两个addObject:参数是否为 nil,例如

id idAttr = [[eff_node objectAtIndex:i]attributeForName:@"id"];
if (idAttr != nil)
{
    [eff_ids addObject:idAttr];
}
GDataXMLElement* initFrom = [[eff_node objectAtIndex:i]elementForName:@"init_from"];
if (initFrom != nil)
{
    [eff_src addObject: initFrom];
}

另请注意,该行

NSArray *eff_node  = [[NSArray alloc] init];

不必要地实例化一个空数组,并且在手动引用计数世界中是内存泄漏。


我刚刚查看了 GDataXML API,它是 a) 未记录的(从某种意义上说,他们无法编写文档,而不是私有 API 的意义)和 b) 有限。

您使用的方法不执行递归搜索,因此您有两个选择,要么实现您自己的递归搜索,要么使用 XPath API。填充应该得到你想要的节点:

 NSError* myError = nil;
 NSArray* initFromNodes = [[eff_node objectAtIndex: i] nodesForXPath: @"//init_from" error: &myError]; 

XPath的//部分意味着“树下的任意数量的级别”

于 2012-10-25T11:21:05.250 回答