0

私は、TouchXML を使用して空港のフライト情報を含む XML を解析するアプリケーションを作成しています。

XML は次のようになります。

<?xml version="1.0" encoding="iso-8859-1"?>
<airport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://flydata.avinor.no/XmlFeed.xsd" name="OSL">
    <flights lastUpdate="2010-10-03T12:29:43">
        <flight uniqueID="1273306">
            <airline>DY</airline>
            <flight_id>DY246</flight_id>
            <dom_int>D</dom_int>
            <schedule_time>2010-10-03T10:45:00</schedule_time>
            <arr_dep>D</arr_dep>
            <airport>TOS</airport>
            <check_in>D</check_in>
            <gate>18</gate>
            <status code="D" time="2010-10-03T10:42:00"/>
        </flight>
        <flight uniqueID="1273799">
            <airline>SK</airline>
            <flight_id>SK263</flight_id>
            <dom_int>D</dom_int>
            <schedule_time>2010-10-03T10:50:00</schedule_time>
            <arr_dep>D</arr_dep>
            <airport>BGO</airport>
            <check_in>EF</check_in>
            <gate>23</gate>
        </flight>
    </flights>
</airport>

TouchXML のドキュメントには、属性を取得する方法が記載されています。これは、 の属性では機能しflightsますが、およびのlastUpdate属性では機能しません。statuscodetime

また、すべてのflightXML エントリにstatus要素が含まれているわけではありませんが、これについてはチェックを行っています。

現在、私が持っているコードは次のとおりです。

-(void)grabXML {
    flightEntries = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:@"http://flydata.avinor.no/XmlFeed.asp?TimeFrom=0&TimeTo=2&airport=OSL&direction=D"];

    CXMLDocument *xmlParser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];

    NSArray *resultNodes = NULL;

    resultNodes = [xmlParser nodesForXPath:@"//flight" error:nil];

    for (CXMLElement *resultElement in resultNodes) {
        NSMutableDictionary *flightItem = [[NSMutableDictionary alloc] init];

        int counter;

        for (counter = 0; counter < [resultElement childCount]; counter++) {
            [flightItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];

            // Check if the node has the <status> element
            if ([[[resultElement childAtIndex:counter] name] isEqualToString:@"status"]) {
                // Fetch the code and time attribute here
            }
        }

        // This gives me <flight uniqueID="*">
        [flightItem setObject:[[resultElement attributeForName:@"uniqueID"] stringValue] forKey:@"uniqueID"];

        [flightEntries addObject:[flightItem copy]];
    }
}

ドキュメントには複数の属性を解析する方法が記載されていません。

4

1 に答える 1

2

まず、リスト内の各項目に特定のタグを使用しようとしているため、XML を扱うのは難しいと言わざるを得ません。例えば:

            <airline>DY</airline>
            <flight_id>DY246</flight_id>
            <dom_int>D</dom_int>
            <schedule_time>2010-10-03T10:45:00</schedule_time>
            <arr_dep>D</arr_dep>
            <airport>TOS</airport>
            <check_in>D</check_in>
            <gate>18</gate>

という名前のタグは意味がありません。XML はデータを定義するのではなく、説明することを目的としているためです。item と呼ばれるエンティティがある場合は、おそらくそれを item と呼び、XML を次のようにする必要があります。

 <level1_items>
    <level1_item>
      <item index="1">text</item_1>
      <item index="2">text</item_2>
    </level1_item>
    <level1_item>
      <item index="1">some text</item_1>
      <item index="2">some more text</item_2>
  </level1_items>

各アイテムにはインデックスがあります。さらに言えば、ドキュメントを TouchXML CXMLDocument にロードし、必要なノードを XPath で取得して、指定した index= パラメータを無視して正しい順序になっていると想定するだけです。

次の問題は、XML を辞書の NSDictioanry または NSArray に変換することはかなり複雑な作業であり、得られるものは努力する価値がないということです。XML を CXMLDocument にロードし、XPath を使用してノードの取得を開始するだけです。このようなもの:

CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString:xmlString options:0 error:nil];

// Returns all 'level1_item' nodes in an array    
NSArray *nodes = [[doc rootElement] nodesForXPath:@"//response/level1_items/level1_item" error:nil];

for (CXMLNode *itemNode in nodes)
{
    for (CXMLNode *childNode in [itemNode children])
    {
        NSString *nodeName = [childNode name]; // should contain item_1 in first iteration
        NSString *nodeValue = [childNode stringValue]; // should contain 'text' in first iteration
        // Do something with the node data.

    }
}

この方法で XML を使用することをお勧めします。問題がある場合は、ここに戻って具体的な質問をしてください。

それが役立つことを願っています。

PK

于 2010-10-03T12:55:27.400 に答える