6

これに似た構造を持つ非常に単純なシナリオがあります

<tours>
    <tour>
        <name>Italy 1</name>
        <destinations>
            <destination>Rome</destination>
            <destination>Milan</destination>
        <destinations>
    </tour>
    <tour>
        <name>Italy 2</name>
        <destinations>
            <destination>Rome</destination>
            <destination>Venice</destination>
        <destinations>
    </tour>
</tours>

次に、ミラノに行くすべてのツアーをクエリしたいと思います。

以下は、EX4 スタイルに基づいて考えることができる論理形式です。

XmlData.tour.(destinations.destination.(name == "Milan"))

しかし、もちろんこれはうまくいきません。

追加のロジックを使用せずにこのデータを取得する正しい方法は何ですか?

4

3 に答える 3

3

XmlData.tour.destinations.destinationですXMLList<destination>Milan</destination>それぞれXMLname=があるように見える XML が含まれているdestinationため、結果として何も得られません。

これを試して:

XmlData.tour.(destinations.destination.children().contains("Milan"));
于 2012-12-17T15:05:07.810 に答える
1

1) 不適切な形式の xml。(終了先に「/」がありません)

2) AS3 E4X-finder で何らかのバグに遭遇したようです。これは本当に奇妙でしたが、ここに回避策があります...

var foo:XMLList = data.tour.destinations.(destination == "Milan");
trace("direct check:  " + foo); //fails - 0 matches
trace("------");
for each(var child:XML in data.tour.destinations.destination) {
    if (child == "Milan") {
        trace("found match in foreach Milan");
    }
}

さらに調査すると、同じ識別子 ( ) を持つタグ内に複数の子があるため、E4X エンジンが台無しになっているようです<destination>

次のように入力すると、「フィルター関数」が期待どおりに動作します。

<destinations>
<destination2>Rome</destination2>
<destination>Milan</destination>
</destinations>

.... それは本当に奇妙です. これについて詳しく説明できる人はいますか? E4X の xml-standards によれば、質問のようにそれを行うことができるはずです。

于 2012-12-17T14:07:08.693 に答える
0

このスクリプトは、XmlData から新しい xml を作成するのに役立ちますが、ミラノへの目的地を含むツアーでのみ使用できます。

var DESTINATION_TO_CHECK:String = "Milan";
var i:int;
var j:int;
var numberOfTours:int = XmlData.tour.length();
var numberOfDestinations:int;
var tours:String = "<tours to='" + DESTINATION_TO_CHECK + "'>";

for (i = 0; i < numberOfTours; i++)
{
    numberOfDestinations = XmlData.tour[i].destinations.destination.length();

    for (j = 0; j < numberOfDestinations; j++)
    {
        if (XmlData.tour[i].destinations.destination[j] == DESTINATION_TO_CHECK)
        {
            tours += XmlData.tour[i];
        }
    }
}

tours += "</tours>";

trace(new XML(tours));
于 2012-12-17T13:34:06.067 に答える