首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TouchXML解析XML属性

TouchXML解析XML属性
EN

Stack Overflow用户
提问于 2009-06-11 15:08:09
回答 3查看 10K关注 0票数 7

我如何使用touchXML来解析这个XML?我希望将所有属性作为键/值对存储在字典中。

代码语言:javascript
复制
<Player PlayerName="Padraig HARRINGTON" CurrentPosition="1" CurrentRank="1"
    Country="IRL" NumberOfHolesPlayed="18" ParRelativeScore="+3">
    <RoundScore RoundNumber="1" Score="74" />
    <RoundScore RoundNumber="2" Score="68" />
    <RoundScore RoundNumber="3" Score="72" />
    <RoundScore RoundNumber="4" Score="69" />
</Player>
<Player PlayerName="Ian POULTER" CurrentPosition="2" CurrentRank="2" Country="ENG" 
    NumberOfHolesPlayed="18" ParRelativeScore="+7">
    <RoundScore RoundNumber="1" Score="72" />
    <RoundScore RoundNumber="2" Score="71" />
    <RoundScore RoundNumber="3" Score="75" />
    <RoundScore RoundNumber="4" Score="69" />
</Player>
<Player PlayerName="Henrik STENSON" CurrentPosition="3" CurrentRank="T3"           Country="SWE" 
    NumberOfHolesPlayed="18" ParRelativeScore="+9">
    <RoundScore RoundNumber="1" Score="76" />
    <RoundScore RoundNumber="2" Score="72" />
    <RoundScore RoundNumber="3" Score="70" />
    <RoundScore RoundNumber="4" Score="71" />
</Player>

我没有问题是XML的格式是这样的:

代码语言:javascript
复制
<Player>
<Country>UK</Country>
<NumberOfHolesPlayed>12</NumberOfHolesPlayed>
...
...

但我不确定在处理属性时该怎么做……

如何使用touchXML获取属性?特别地,如果节点具有也具有属性的子节点..

根据第一个示例XML文件。在第一个XML示例中,我设法获得了播放器属性,但没有获得子节点的'RoundScore‘属性。

会很乐意伸出援手..

谢谢,

EN

回答 3

Stack Overflow用户

发布于 2010-08-13 15:13:24

有关更多信息,请访问visit this post 。我已经对它做了完整的简要介绍。

是啊!解决了你的问题。

请看下面的代码。希望你能理解。它可以满足您的需求。我还添加了- NSLog - Result - parsed。

代码语言:javascript
复制
-(void)methodForParsingPlayers{
    NSMutableArray *ar=[[NSMutableArray alloc] init];
    CXMLDocument *doc=[[[CXMLDocument alloc] initWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Players" ofType:@"xml"]] options:0 error:nil] autorelease];

    NSArray *nodes=nil;
    nodes=[doc nodesForXPath:@"//Player" error:nil];

    NSString *strValue;
    NSString *strName;

    for (CXMLElement *node in nodes) {
        NSMutableDictionary *object=[[NSMutableDictionary alloc] init];

        // process to set attributes of object ----------------------------------------
        NSMutableDictionary *objectAttributes=[[NSMutableDictionary alloc] init];
        NSArray *arAttr=[node attributes];
        NSUInteger i, countAttr = [arAttr count];
        for (i = 0; i < countAttr; i++) {
            strValue=[[arAttr objectAtIndex:i] stringValue];
            strName=[[arAttr objectAtIndex:i] name];
            if(strValue && strName){
                [objectAttributes setValue:strValue forKey:strName];
            }
        }
        [object setValue:objectAttributes forKey:[node name]];
        [objectAttributes release]; objectAttributes=nil;
        // --------------------------------------------------------------------------------

        // process to read elements of object ----------------------------------------
        NSUInteger j, countElements = [node childCount];
        CXMLNode *element;
        NSMutableDictionary *elementDictionary=nil;
        for (j=0; j<countElements; j++) {
            element=[node childAtIndex:j];
            elementDictionary=[[NSMutableDictionary alloc] init];

            // process to read element attributes ----------------------------------
            if([element isMemberOfClass:[CXMLElement class]]){
                CXMLElement *element2=(CXMLElement*)element;
                arAttr=[element2 attributes];
                countAttr=[arAttr count];
                for (i=0; i<countAttr; i++) {
                    strName=[[arAttr objectAtIndex:i] name];
                    strValue=[[arAttr objectAtIndex:i] stringValue];
                    if(strName && strValue){
                        [elementDictionary setValue:strValue forKey:strName];
                    }
                }
            }
            // --------------------------------------------------------------------

            // element value if available
            strValue=[element stringValue];
            if(strValue){
                [elementDictionary setValue:strValue forKey:@"value"];
            }
            // ---------------------------------------------------------------------

            // check if object/dictionary exists for this key "name"
            strName=[element name];
            if([object valueForKey:strName]){
                if([[object valueForKey:strName] isKindOfClass:[NSMutableDictionary class]]){
                    NSMutableDictionary *d=[[NSMutableDictionary alloc] initWithDictionary:[object valueForKey:strName]];
                    NSMutableArray *arOFSameElementName=[[NSMutableArray alloc] initWithObjects:d,elementDictionary,nil];
                    [object setValue:arOFSameElementName forKey:strName];
                    [d release]; d=nil;
                    [arOFSameElementName release]; arOFSameElementName=nil;
                } else {
                    NSMutableArray *arOFSameElementName=[object valueForKey:strName];
                    [arOFSameElementName addObject:elementDictionary];
                }
            } else {
                [object setValue:elementDictionary forKey:strName];
            }
            [elementDictionary release]; elementDictionary=nil;
            // ---------------------------------------------------------------------
        }
        [ar addObject:object];
        [object release]; object=nil;
        // --------------------------------------------------------------------------------
    }
    NSLog(@"%@",[ar description]);
}


2010-08-13 12:45:48.786 TouchTry[2850:207] (
        {
        Player =         {
            Country = IRL;
            CurrentPosition = 1;
            CurrentRank = 1;
            NumberOfHolesPlayed = 18;
            ParRelativeScore = "+3";
            PlayerName = "Padraig HARRINGTON";
        };
        RoundScore =         (
                        {
                RoundNumber = 1;
                Score = 74;
            },
                        {
                RoundNumber = 2;
                Score = 68;
            },
                        {
                RoundNumber = 3;
                Score = 72;
            },
                        {
                RoundNumber = 4;
                Score = 69;
            }
        );
    },
        {
        Player =         {
            Country = ENG;
            CurrentPosition = 2;
            CurrentRank = 2;
            NumberOfHolesPlayed = 18;
            ParRelativeScore = "+7";
            PlayerName = "Ian POULTER";
        };
        RoundScore =         (
                        {
                RoundNumber = 1;
                Score = 72;
            },
                        {
                RoundNumber = 2;
                Score = 71;
            },
                        {
                RoundNumber = 3;
                Score = 75;
            },
                        {
                RoundNumber = 4;
                Score = 69;
            }
        );
    },
        {
        Player =         {
            Country = SWE;
            CurrentPosition = 3;
            CurrentRank = T3;
            NumberOfHolesPlayed = 18;
            ParRelativeScore = "+9";
            PlayerName = "Henrik STENSON";
        };
        RoundScore =         (
                        {
                RoundNumber = 1;
                Score = 76;
            },
                        {
                RoundNumber = 2;
                Score = 72;
            },
                        {
                RoundNumber = 3;
                Score = 70;
            },
                        {
                RoundNumber = 4;
                Score = 71;
            }
        );
    }
)
票数 13
EN

Stack Overflow用户

发布于 2010-08-26 17:46:52

使用TBXML,处理XML文件要容易得多,速度也快得多。文档也很不错。在这里可以更容易地解决您的属性问题。http://www.tbxml.co.uk/TBXML/TBXML_Free.html

票数 1
EN

Stack Overflow用户

发布于 2009-06-21 21:59:58

我发现你必须检查子节点是否为CXElements。有时它们是CXMLNodes,它们没有属性属性。

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

https://stackoverflow.com/questions/981700

复制
相关文章

相似问题

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