2009-06-11 40 views
7

Làm cách nào để sử dụng touchXML để phân tích cú pháp XML này? Tôi muốn lưu trữ tất cả các thuộc tính dưới dạng cặp khóa/giá trị trong từ điển.TouchXML phân tích cú pháp thuộc tính 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> 

Tôi không có vấn đề là XML được định dạng như sau:

<Player> 
<Country>UK</Country> 
<NumberOfHolesPlayed>12</NumberOfHolesPlayed> 
... 
... 

Nhưng tôi không biết phải làm gì khi đối phó với các thuộc tính ...

Làm cách nào để bạn có được các thuộc tính với touchXML? Cụ thể, nếu nút có nút con cũng có thuộc tính ..

Theo tệp XML mẫu đầu tiên. Trong ví dụ XML đầu tiên, tôi đã quản lý để có được các thuộc tính Player nhưng không có thuộc tính của các nút con 'RoundScore'.

Rất thích một bàn tay giúp đỡ ..

Cảm ơn,

Dan

Trả lời

0

tôi phát hiện ra rằng bạn phải kiểm tra đứa trẻ nút là CXElements. Đôi khi chúng là CXMLNodes và chúng không có thuộc tính thuộc tính.

+0

Vì vậy, câu hỏi của bạn đã được trả lời? Nếu nó là xin vui lòng đánh dấu nó như vậy. – JoePasq

+0

bạn có thể vui lòng đăng một ví dụ không? Tôi có cùng một câu hỏi về phân tích cú pháp thuộc tính thẻ XML. – sniurkst

13

Để biết thêm thông tin visit this post. Tôi đã nói tóm tắt về nó.

Đúng! giải quyết vấn đề của bạn.

xem, mã sau. Mong là bạn hiểu. Nó hoạt động theo yêu cầu của bạn. Tôi cũng đã thêm - 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; 
      } 
     ); 
    } 
) 
+0

, Cảm ơn bạn. nó thực sự đã giúp tôi. –

+0

@Spark. NodeforXpath có cần thiết không? Tôi muốn đăng một số dữ liệu lên máy chủ? Tôi nhận được dữ liệu từ máy chủ là ok, nhưng tôi không thể đăng hoặc cập nhật nó lên server.I có dịch vụ web. –

1

Sử dụng TBXML, dễ dàng hơn và nhanh hơn khi làm việc với tệp XML. Nice tài liệu cũng có. Sự cố của bạn với Thuộc tính được giải quyết dễ dàng hơn tại đây. http://www.tbxml.co.uk/TBXML/TBXML_Free.html

Các vấn đề liên quan