2010-12-30 14 views
0

私は今問題が発生していますが、私はネストした問題の答えです。私はこのように見ているXML持っネストされたxml要素内の名前空間

:今

> 
<em> 
<type xmlns="http://www.sitcom-project.org/sitcom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <model> 
    <implemented_with>comoco</implemented_with> 
    <implemented_in>perl</implemented_in> 
    <cash_flow>casual</cash_flow> 
    <interaction>conventional</interaction> 
    </model> 
</type> 
</em> 

を、どのように私はimplemented_withノードの要素にアクセスできますか?

ofc私はこのようにxmlListにアクセスできました: 名前空間ns = www.sitcom-project.org/sitcom; type.ns :: model; 今、モデルxmlListのimplement_withノードにどうやってアクセスしますか? 私はtype.ns :: model.implemented_withを試しましたが、動作しませんでした。誰でも知っている? ありがとう

答えて

1

これを行うにはいくつかの方法がありますが、各ドットアクセスの前に名前空間プレフィックスを使用することをお勧めします。あなたの場合、最初にしたいのは、名前空間を分離することです。名前空間を新しい名前空間オブジェクトにハードコーディングすることでこれを行うことができます。

var ns:Namespace = new Namespace("http://www.sitcom-project.org/sitcom"); 

より良い方法は、適切なノードからそれを抽出することです。次のコードでは、型ノードで宣言されたすべての名前空間(配列として)を取得しています。リスト内の最初のものを対象にしています。あらかじめ名前空間が分からないので、children()メソッドを使って名前空間を取得する必要があります。

var emNode:XML = _yourXML.em[0]; 
var typeRoot:XML = emNode.children()[0]; 
var ns:Namespace = typeRoot.namespaceDeclarations()[0]; 

これを実行したら、名前空間構文を使用してモデルを掘り下げることができます。

var impWith:String = typeRoot.ns::model.ns::implemented_with; 

これは少し冗長なので、次の構文を使用してデフォルトの名前空間を設定できます。私はこれを個人的に好きではありませんが、動作します。

default xml namespace = ns; 
var impWith:String = typeRoot.model.implemented_with; 
default xml namespace = null; 

シンプルな1ライナーが可能です。デフォルトの構文

default xml namespace = new Namespace("http://www.sitcom-project.org/sitcom"); 
var imp:String = _yourXML.em[0].type.model.implemented_with; 
default xml namespace = null; 

を使用して

var ns:Namespace = new Namespace("http://www.sitcom-project.org/sitcom"); 
var imp:String = _yourXML.em[0].ns::type.ns::model.ns::implemented_with; 

は、この情報がお役に立てば幸いです。

+0

ActionScriptには、「default xml namespace」というキャッチがあります。終了したら、空の名前空間にリセットするか、実行時エラーが発生する可能性があります。 – alxx

+0

あなたのコメントを反映するために私の答えを編集しました – Nicholas

関連する問題