0

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ループの反復番号で変更する必要がありますが、これは機能しません。

4

1 に答える 1

0

このコードで確認してください:

 NSArray *colors = [doc nodesForXPath:@"//Party/Player/Name/@color" error:NULL];
 for (GDataXMLElement *color in colors)
 {
     NSLog(@"Color : %@ ",[color stringValue]);
 }

ここ:

docあなたのGDataXMLDocument

編集:

各Nameタグに対応する個別の色を設定する必要がある場合は、loadPartyメソッドで次のように変更します。

// Name
NSArray *names = [partyMember elementsForName:@"Name"];
if (names.count > 0)
{
    GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0];
    NSLog(@"Color : %@",[[firstName attributeForName:@"color"] stringValue]);
    name = firstName.stringValue;
 } else continue;
于 2013-03-01T09:36:23.817 に答える