XPath用のGDataXMLlibとこのチュートリアルを使用しています:http ://www.raywenderlich.com/725/how-to-read-and-write-xml-documents-with-gdataxml
彼のxmlは次のようになります。
<Party>
<Player>
<Name>Butch</Name>
<Level>1</Level>
<Class>Fighter</Class>
<HP>20</HP>
<MaxHP>20</MaxHP>
</Player>
<Player>
<Name>Shadow</Name>
<Level>2</Level>
<Class>Rogue</Class>
<HP>15</HP>
<MaxHP>15</MaxHP>
</Player>
<Player>
<Name>Crak</Name>
<Level>3</Level>
<Class>Wizard</Class>
<HP>10</HP>
<MaxHP>10</MaxHP>
</Player>
しかし、Nameタグに次のような属性がある場合はどうなりますか?
<Player>
<Name color="red">Butch</Name> // Color attribute
<Level>1</Level>
<Class>Fighter</Class>
<HP>20</HP>
<MaxHP>20</MaxHP>
</Player>
チュートリアルを見ると、彼はこれを手に入れました:
Party *party = [[[Party alloc] init] autorelease];
NSArray *partyMembers = [doc.rootElement elementsForName:@"Player"];
for (GDataXMLElement *partyMember in partyMembers) {
// Let's fill these in!
NSString *name;
int level;
RPGClass rpgClass;
// Name
NSArray *names = [partyMember elementsForName:@"Name"];
if (names.count > 0) {
GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0];
name = firstName.stringValue;
} else continue;
...etc
彼はすべてのpartyMembersを含むforループを使用しており、各タグを取得していますが、タグが前に説明した色のような属性を取得した場合はどうなりますか?
私はこれを試しました:
NSArray *colors = [partyMember nodesForXPath:@"string(/Player/Name/@color)" error:nil] ;
if (colors != nil && colors.count > 0) {
GDataXMLElement *firstColor = (GDataXMLElement *) [colors objectAtIndex:0];
NSString *color = firstColor.stringValue;
NSLog(@"%@",color);
}
しかし、これは何もしません。私が間違っていることについて何か考えはありますか?
編集: これは動作します:
NSArray *colors = [partyMember nodesForXPath:@"//Player/Name/@color" error:nil] ;
if (colors != nil && colors.count > 0) {
GDataXMLElement *firstColor = (GDataXMLElement *) [colors objectAtIndex:0];
NSString *color = firstColor.stringValue;
NSLog(@"%@",color);
}
しかし、このようなカラータグがもっとある場合:
<Player>
<Name color="red">Butch</Name> // Color attribute
<Level>1</Level>
<Class>Fighter</Class>
<HP>20</HP>
<MaxHP>20</MaxHP>
</Player>
<Player>
<Name color="red">Butch</Name> // Color attribute
<Level>1</Level>
<Class>Fighter</Class>
<HP>20</HP>
<MaxHP>20</MaxHP>
</Player>
<Player>
<Name color="red">Butch</Name> // Color attribute
<Level>1</Level>
<Class>Fighter</Class>
<HP>20</HP>
<MaxHP>20</MaxHP>
</Player>
次に、3回赤で印刷されます。最初のウィンドウからのみ必要であり、forループの2番目の反復で2番目の反復が必要になります。
だから私はこれを考えていました:
NSArray *colors = [partyMember nodesForXPath:@"//Player[0]/Name/@color" error:nil] ;
if (colors != nil && colors.count > 0) {
GDataXMLElement *firstColor = (GDataXMLElement *) [colors objectAtIndex:0];
NSString *color = firstColor.stringValue;
NSLog(@"%@",color);
}
Player [0]を追加しましたが、後でforループの反復番号で変更する必要がありますが、これは機能しません。