0

このプログラムを手伝ってもらえますか 2 つのレベルで xml ファイルを解析しようとしています (用語がわからないので、そのように呼んでいます) これが私の xml ファイルのサンプルです

<?xml version="1.0" encoding="UTF-8"?>
<countries>
<country>
    <countryname>Philippines</countryname>
<subsidiaries>
    <subsidiary>
           <name>Sart Philippines Inc.</name>
           <address>Unit 10-A The World Empire Building, 330 Senator Gil Puyat Avenue  Philippines, Philippines</address>
           <phone>+63.2.929</phone>
           <fax>+63.932</fax>
           <email>enquiry.philippines@sarts.com</email>
           <website>http://www.sartorius-mechatronics.com.ph</website>
    </subsidiary>
</subsidiaries>
</country>
<country>
    <countryname>Denmark</countryname>
    <subsidiaries>
        <subsidiary>
           <name>Stedim Nordic A|S</name>
           <address>Hoerskaetten 6d 2630 Taastrup, Denmark</address>
           <phone>+45.7023.4400</phone>
           <fax>+45.4630.4030</fax>
           <email>ne.customersupport@sartorius.com</email>
           <website></website>
        </subsidiary>
        <subsidiary>
           <name>Nordic A|S</name>
           <address>Hoerskaetten 6D 2630 Taastrup, Denmark</address>
           <phone>+45.7523.8700</phone>
           <fax>+45.4130.4020</fax>
           <email>ne.customersupport@sartorius.com</email>
           <website></website>
       </subsidiary>
     </subsidiaries>
   </country>
</countries>

私が計画していたのは、国を選択してから、子会社を選択してその情報を表示することでした。解析できましたが、Stedim Nordic A|S 子会社を表示できませんでした。

ここに私のパーサークラスがあります

@implementation Parser

-(id)initParser
{
    if (self == [super init])
    {
        app = (AppDelegate *) [[UIApplication sharedApplication]delegate];
    }
    return self;
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"countries"])
    {
        app.listArray = [[NSMutableArray alloc]init];

    }
  if ([elementName isEqualToString:@"country"])
    {
        theList = [[List alloc]init];

    }

}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (!currentElementValue)
    {
        currentElementValue = [[NSMutableString alloc]initWithString:string];
    }
    else
    {
        [currentElementValue appendString:string];
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
{

   if ([elementName isEqualToString:@"country"])
    {
        [app.listArray addObject:theList];
    }

    else {

         if ([elementName isEqualToString:@"countryname"]) {
            theList.countryname = currentElementValue;
        }
        if ([elementName isEqualToString:@"name"])
        {
            theList.name = currentElementValue;
        }
        if ([elementName isEqualToString:@"address"])
        {
            theList.address = currentElementValue;
        }
        if ([elementName isEqualToString:@"phone"])
        {
            theList.phone = currentElementValue;
        }
        if ([elementName isEqualToString:@"fax"])
        {
            theList.fax = currentElementValue;
        }
        if ([elementName isEqualToString:@"email"])
        {
            theList.email = currentElementValue;
        }
        if ([elementName isEqualToString:@"website"])
        {
            theList.website = currentElementValue;

      }

       currentElementValue = nil;

    }


}
@end

うまく説明できませんが、この種の問題のチュートリアルへのリンクを送っていただければ幸いです。

4

2 に答える 2

0

パーサーを再帰的に呼び出すことができます。あなたが探しているものが利用可能であるかどうかを知っていて、存在する場合はその価値を取ります。gdataxmlパーサーを調べることをお勧めします

于 2013-01-22T09:17:02.740 に答える
0

問題は、2 番目のcountry要素に two があるためsubsidiaryです。したがって、次のようにコードを変更する必要があります。

NSStringを保持するためにもう 1 つ必要ですCountry Name。2 つの国名要素が 1 つあるためsubsidiaryです。

NSString *temp = nil;

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"countries"])
    {
        app.listArray = [[NSMutableArray alloc]init];

    }
    if ([elementName isEqualToString:@"subsidiary"])
    {
        theList = [[List alloc]init];
    }
}


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
{

   if ([elementName isEqualToString:@"subsidiary"])
    {
        theList.countryname = temp;
        [app.listArray addObject:theList];
    }
    else
    {

         if ([elementName isEqualToString:@"countryname"])
         {
            temp = currentElementValue;
         }
        if ([elementName isEqualToString:@"name"])
        {
            theList.name = currentElementValue;
        }
        if ([elementName isEqualToString:@"address"])
        {
            theList.address = currentElementValue;
        }
        if ([elementName isEqualToString:@"phone"])
        {
            theList.phone = currentElementValue;
        }
        if ([elementName isEqualToString:@"fax"])
        {
            theList.fax = currentElementValue;
        }
        if ([elementName isEqualToString:@"email"])
        {
            theList.email = currentElementValue;
        }
        if ([elementName isEqualToString:@"website"])
        {
            theList.website = currentElementValue;
        }
        currentElementValue = nil;
    }
}
于 2013-01-23T08:30:50.293 に答える