0

次のような XML が少しあります。

<LayerDefinition xsi:type ="GridLayerDefinition">
  <Name>Solids</Name>
  <Grid>
    <Width>48</Width>
    <Height>48</Height>
  </Grid>
  <ScrollFactor>
    <X>1</X>
    <Y>1</Y>
  </ScrollFactor>
  <Color A="255" R="0" G="0" B="0" />
  <ExportMode>Rectangles</ExportMode>
</LayerDefinition>

その xsi:type 属性の値を取得したいと思います。コロンがあるため、単純に .@whatever を使用することはできません。コンパイルされません。.attribute("xsi:type") を使用するように勧められましたが、何も返されません。これが私のコードです。

private function loadProject():void
    {
        var curProject:XML = FP.getXML(TESTPROJECT);
        var entry:XML;
        var counter:uint = 0;
        trace("Loading project");
    //  trace(curProject.*);
        trace (curProject.LayerDefinitions.LayerDefinition.attribute("xsi:type"));
        for each (entry in curProject.LayerDefinitions.LayerDefinition)
        {
            //trace("Grid type is: " + entry.attribute("xsi:type"));
            //  trace("Grid type is: " + entry.attribute('xsi:type'));
            //  trace ("Grid is: " + entry.Name);
        }
    }

何かアドバイス?この時点ですべてを試したような気がします

4

1 に答える 1

1

あなたの他の投稿に対する私のコメントに返信しなかったのはなぜですか? xsi はどこで定義されていますか? この XML を使用するコードのどこかに xmlns:xsi="someuri" があるはずです。AS3 の E4X がこれらの修飾された属性またはノードを取得するには、AS3 で名前空間を作成する必要がありました。

以下のドキュメントの XML 名前空間と呼ばれるセクションを読んでください。

http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=4

基本的に、次のようなことを行う必要があります(以下は上記のリンクから取得したものです):

// XML with xpl namespace
var xml:XML = 
    <xml xmlns:xpl="http://www.example.com/uri/">
        <xpl:text value="Hello World" xpl:value="Hello Namespace" />
    </xml>;

// Define namespace with xpl URI
var xplNs:Namespace = new Namespace("http://www.example.com/uri/");

// Get value of text attribute
// with and without namespace
trace(xml.xplNs::text.@value); // traces Hello World
trace(xml.xplNs::text.@xplNs::value); // traces Hello Namespace

別のオプションは次のとおりです。

var xplNs:Namespace = new Namespace("http://www.example.com/uri/");
use namespace xmplNs;

あなたの場合、新しい名前空間呼び出しの引数は、 xmlns:xsi= が設定されているものでなければなりません。次に、その名前空間を使用して取得したいアトリビュートまたはノードの前に xplNs:: または名前を付けた Namespace インスタンスを付けます。

または、よりハックなアプローチで問題ない場合は、このサイトのアドバイスに従って名前空間を削除することもできます(確かに、以前にこれを自分で行ったことがありますが、正しく実行できることに対する汚い回避策であると常に感じていました)http ://brianmriley.wordpress.com/2008/03/14/remove-xml-namespaces-in-flex-or-as3/

コードのどこにも xmlns:xsi がない場合、何が起こっているのか途方に暮れています。

于 2012-08-02T02:09:28.597 に答える