-1

この XML コードを IOS で解析しようとしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<ofertas>
    <oferta>
        <id>138</id>
        <connector/>
        <codigo>PARMAD</codigo>
        <titulo><![CDATA[Madrid, BordÈus e Paris]]></titulo>

        <descricao><![CDATA[ 7 dias c/ Pequeno AlmoÁo - Apenas Circuito Terrestre - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo de Lisboa - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo do Porto - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo de Faro - Alojamento e Pequeno-AlmoÁo]]></descricao>
        <datas><![CDATA[Consultar programa]]></datas>
        <data1>2012-07-31</data1>
        <data2>2013-03-23</data2>

        <categoria>Europa</categoria>
        <subcategoria>Circuitos Europa</subcategoria>
        <zona>Turistica</zona>
        <tipo>Circuitos Europa</tipo>

        <valor>575</valor>
        <dias>6</dias>

        <imagem>http://www.optitravel.net/optitravel/www/media/custom/cli_202/media/PKT_138_1343738358.jpg</imagem>

        <link/>

    </oferta>

    <oferta>
        <id>140</id>
        <connector/>
        <codigo>PARPRG</codigo>
        <titulo><![CDATA[Paris, Frankfurt e Praga]]></titulo>

        <descricao><![CDATA[ 7 dias c/ Pequeno AlmoÁo - Apenas Circuito Terrestre - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo de Lisboa - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo do Porto - Alojamento e Pequeno-AlmoÁo ; 7 dias c/ Pequeno AlmoÁo - SaÌda com voo de Faro - Alojamento e Pequeno-AlmoÁo]]></descricao>
        <datas><![CDATA[01/Nov, 08/Nov, 15/Nov, 29/Nov, 13/Dez, 27/Dez, 10/Jan/2013, 24/Jan/2013, 07/Fev/2013, 21/Fev/2013, 07/Mar/2013, 21/Mar/2013]]></datas>
        <data1>2012-08-01</data1>
        <data2>2013-03-21</data2>

大きなファイルを解析するのに最適なオプションかどうかはわかりませんが、SMXMLDocumentこの特定の XML を解析するために使用しています。私が抱えている問題は、この XML をデコードできないことです。以下は、私が使用している XML パーサーの作成者によって提供されたコード サンプルです。

  //REPLACED WITH MY XML DOC
NSString *sampleXML = [[NSBundle mainBundle] pathForResource:@"global" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:sampleXML];

// create a new SMXMLDocument with the contents of sample.xml
NSError *error;
SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error];

// check for errors
if (error) {
    NSLog(@"Error while parsing the document: %@", error);
    return;
}

// demonstrate -description of document/element classes
NSLog(@"Document:\n %@", document);

// Pull out the <books> node
SMXMLElement *books = [document.root childNamed:@"????"];

// Look through <books> children of type <book>
for (SMXMLElement *book in [books childrenNamed:@"????"]) {

    // demonstrate common cases of extracting XML data
    NSString *isbn = [book attributeNamed:@"id"]; // XML attribute
    NSString *title = [book valueWithPath:@"titulo"]; // child node value


    // show off some KVC magic
    NSArray *authors = [[book childNamed:@"authors"].children valueForKey:@"value"];

    NSLog(@"Found a book!\n ISBN: %@ \n Title: %@ \n Price: %f \n", isbn, title, price);
}

このドキュメントを解析するためのより優れた XML パーサーがある場合は、アドバイスしてください。

4

2 に答える 2

1

@AppleDelegate が言ったように、TBXML パーサーも使用します。これが私が使用するコードです。TBXML+HTTP.h使用する前にインポートする必要があります。必要な場所で [self getXML] を呼び出すだけで、あとはコードが処理します。

最初に xml を取得します。

-(void)getXML {

    NSLog(@"Getting XML");

    // Create a success block to be called when the async request completes
    TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {

        // If TBXML found a root node, process element and iterate all children
        if (tbxmlDocument.rootXMLElement)
            [self traverseElement:tbxmlDocument.rootXMLElement];

    };

    // Create a failure block that gets called if something goes wrong
    TBXMLFailureBlock failureBlock = ^(TBXML *tbxmlDocument, NSError * error) {
        NSLog(@"Error! %@ %@", [error localizedDescription], [error userInfo]);
    };

    // Initialize TBXML with the URL of an XML doc. TBXML asynchronously loads and parses the file.
    TBXML *tbxml = [[TBXML alloc] initWithURL: [NSURL URLWithString:@"File.xml"] 
                                      success: successBlock 
                                      failure: failureBlock];
}

次に、ファイルを読みます。

- (void) traverseElement:(TBXMLElement *)element {

    TBXMLElement *oferta = element->firstChild;

    do {

        // Obtain first attribute from element
        TBXMLElement *element = oferta->firstChild;
        NSString *ofertaId = [NSString stringWithString: [TBXML textForElement:element]];
        NSLog(@"%@", ofertaId);

        // Obtain the next element
        element = element->nextSibling;
        // Nothing to do (<connector/>)

        // Obtain the next element
        element = element->nextSibling;
        NSString *codigo = [TBXML textForElement:element];
        NSLog(@"%@", codigo);

        // Obtain the next element
        element = element->nextSibling;
        NSString *titulo = [TBXML textForElement:element];
        NSLog(@"%@", titulo);

        // Obtain the next element
        element = element->nextSibling;
        NSString *descricao = [TBXML textForElement:element];
        NSLog(@"%@", descricao);

        // Obtain the next element
        element = element->nextSibling;
        NSString *datas = [TBXML textForElement:element];
        NSLog(@"%@", datas);

        // Obtain the next element
        element = element->nextSibling;
        NSString *data1 = [TBXML textForElement:element];
        NSLog(@"%@", data1);

        // Obtain the next element
        element = element->nextSibling;
        NSString *data2 = [TBXML textForElement:element];
        NSLog(@"%@", data2);

        // Obtain the next element
        element = element->nextSibling;
        NSString *categoria = [TBXML textForElement:element];
        NSLog(@"%@", categoria);

        // Obtain the next element
        element = element->nextSibling;
        NSString *subcategoria = [TBXML textForElement:element];
        NSLog(@"%@", subcategoria);

        // Obtain the next element
        element = element->nextSibling;
        NSString *zona = [TBXML textForElement:element];
        NSLog(@"%@", zona);

        // Obtain the next element
        element = element->nextSibling;
        NSString *tipo = [TBXML textForElement:element];
        NSLog(@"%@", tipo);

        // Obtain the next element
        element = element->nextSibling;
        NSString *valor = [TBXML textForElement:element];
        NSLog(@"%@", valor);

        // Obtain the next element
        element = element->nextSibling;
        NSString *dias = [TBXML textForElement:element];
        NSLog(@"%@", dias);

        // Obtain the next element
        element = element->nextSibling;
        NSString *imagem = [TBXML textForElement:element];
        NSLog(@"%@", imagem);

        // Obtain the next element
        element = element->nextSibling;
        // Nothing to do (<link/>)

        // Save infos

    } while ((oferta = oferta->nextSibling));

    NSLog(@"Done");
}

コードをテストしたところ、問題なく動作しているようです (コードを実行し、コンソール ログを確認してください)。あなたがする必要があるのは// Save infos、私のコードから、好きなようにすべての文字列を保存するものに変更することだけです. do-while は<oferta>xml のすべての要素を調べ、必要なすべての要素を個別の文字列に保存します。その後、文字列を操作して日付、数値などを保存できます。

于 2012-10-30T09:43:26.823 に答える
1

TBXML パーサーを選択できます。これは、最小限のリソースを利用しながら、可能な限り高速な XML 解析を提供することを目的としています。

于 2012-10-30T09:09:19.483 に答える