我如何使用touchXML来解析这个XML?我希望将所有属性作为键/值对存储在字典中。
<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的格式是这样的:
<Player>
<Country>UK</Country>
<NumberOfHolesPlayed>12</NumberOfHolesPlayed>
...
...
但我不确定在处理属性时该怎么做……
如何使用touchXML获取属性?特别地,如果节点具有也具有属性的子节点..
根据第一个示例XML文件。在第一个XML示例中,我设法获得了播放器属性,但没有获得子节点的'RoundScore‘属性。
会很乐意伸出援手..
谢谢,
丹
发布于 2010-08-13 15:13:24
有关更多信息,请访问visit this post 。我已经对它做了完整的简要介绍。
是啊!解决了你的问题。
请看下面的代码。希望你能理解。它可以满足您的需求。我还添加了- NSLog - Result - parsed。
-(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;
}
);
}
)发布于 2010-08-26 17:46:52
使用TBXML,处理XML文件要容易得多,速度也快得多。文档也很不错。在这里可以更容易地解决您的属性问题。http://www.tbxml.co.uk/TBXML/TBXML_Free.html
发布于 2009-06-21 21:59:58
我发现你必须检查子节点是否为CXElements。有时它们是CXMLNodes,它们没有属性属性。
https://stackoverflow.com/questions/981700
复制相似问题