2009-03-23 14 views
2

私のFlexアプリケーションでは、XMLを返すいくつかの.NET WebServiceを呼び出します。ただし、これらのWebサービスはすべて名前空間を使用してXMLを返します。私は読んで/名前空間を参照せずにXMLを解析、私はWebサービスを呼び出して、各クラスに次のコード行を含める必要があることを意味することはできません。XML文書から名前空間を削除するにはどうすればよいですか?

private namespace PCRWebServices = "xxx.somename.web.services"; 

use namespace PCRWebServices; 

私はハード、この静的/の必要性を排除したいと思いますコード化されたロジックはWebServiceからXMLを読み込むだけです。

「通常の」XML文書として読み取ることができるように、XMLから名前空間を「削除する」方法はありますか?

私は結果や障害を扱うすべてのWebサービス呼び出しの拡張クラスがあります:私はXMLを「変換」に結果ハンドラにいくつかのロジックを追加したいと思い

private function faultHandler(event:FaultEvent):void 
{ 

} 

private function resultHandler(event:ResultEvent):void 
{ 
    var resultXML:XML = new XML(event.result); 
} 

を。何か案は?

これに何trace(resultXML)リターン:

<GetDataResult xmlns="xxx.somename.web.services"> 
    <DataSet> 
    <Data> 
     <IdNmb>15</IdNmb> 
     <NameTxt>Hello</NameTxt> 
    </Data> 
    <Data> 
     <IdNmb>16</IdNmb> 
     <NameTxt>World</NameTxt> 
    </Data> 
    <Status> 
     <Status>Success</Status> 
    </Status> 
    <ReturnCode> 
     <ReturnCode>0</ReturnCode> 
    </ReturnCode> 
    </DataSet> 
</GetDataResult> 

答えて

2

。ここで

http://brianmriley.wordpress.com/2008/03/14/remove-xml-namespaces-in-flex-or-as3/

私はそれを実装する方法です:

private function resultHandler(event:ResultEvent):void 
{ 
    var resultXML:XML = 
     removeDefaultNamespaceFromXML(new XML(event.result)); 

    // play with your XML here 
} 

private function removeDefaultNamespaceFromXML(xml:XML):XML 
{ 
    var rawXMLString:String = xml.toXMLString(); 

    /* Define the regex pattern to remove the default namespace from the 
     String representation of the XML result. */ 
    var xmlnsPattern:RegExp = 
     new RegExp("xmlns=[^\"]*\"[^\"]*\"", "gi"); 

    /* Replace the default namespace from the String representation of the 
     result XML with an empty string. */ 
    var cleanXMLString:String = rawXMLString.replace(xmlnsPattern, ""); 

    // Create a new XML Object from the String just created 
    return new XML(cleanXMLString); 
} 
+0

これは1つの名前空間だけを削除します... –

+1

ありがとうございます。これは私の質問に答えたので、downvoteの必要性を見ていない "名前空間"。私はあなたの答えをとにかくupvoteします。 –

+0

ちょっと短い: var xmlString:String = xml.toXMLString(); \t \t \t xmlString = xmlString.replace(/のxmlns = "[^"] + "/ G ''); \t \t \tリターン新しいXML(xmlString)。 – Nux

1

あなたが設定されている使用の名前空間を指定し、デフォルトの名前空間として、代わりにあなたが要素にアクセスしようとすると、名前空間を渡すことができることを呼び出すの

-1

私はこれにいくつかの問題があることを覚えています。私はどうやって解決したのか覚えていないが、removeNamespace関数が良いスタートだと思っている。 は多分のようなもの:

private function resultHandler(event:ResultEvent):void 
{ 
    var resultXML:XML = new XML(event.result); 

    for each(var ns:Namespace in resultXML.namespaceDeclarations()) 
     resultXML.removeNamespace(ns); 
} 

私はちょうど私の頭の上から、全くのコードをテストしていません。

あなたはここで多くを読むことができます:私はXMLStringから名前空間を削除する正規表現を使用して、この回避策を見つけ http://help.adobe.com/en_US/AS3LCR/Flash_10.0/XML.html#removeNamespace()

+0

これは名前空間宣言から名前空間を削除しますが、それでもXML文書にあり、 "use namespace ..."を除いてXMLノードを読み取ることはできません。 –

+0

あなたは正しく、すべてのネームスペースではうまく動作しません(ドキュメントを参照)。私は新しいソリューションを追加します。 –

3

ここで別の正規表現ソリューションです。 1つではなく複数の名前空間が削除されます。

private function resultHandler(event:ResultEvent):void 
{ 
    var nsRegEx:RegExp = new RegExp(" xmlns(?:.*?)?=\".*?\"", "gim"); 

    var resultXML:XML = new XML(String(event.result).replace(nsRegEx, ""));   
} 
1

xmlの名前空間を文字列として削除するハックは使用しません。それは醜いハックです(非効率的ではありません)。あなたのコードでネームスペースをハードコーディングするのを避けるためにできることは、xmlオブジェクトにデフォルトネームスペースが何かを尋ねて、それを使用することです。このように:

var defaultNS:Namespace = xml.namespace(""); // get default namespace 
use namespace defaultNS; // use default ns 
1

私はあなたが意図的に(たとえば、別の名前空間のXMLからコンテンツを翻訳または変換しようとしているとき、XMLと対話するための適切な方法は、その名前空間を通してそれをアドレス指定することであることに同意しますが、FXG to MXML)時々あなたはダウンして汚れて、XMLを文字列としてハックする必要があります。これは決して最もエレガントではなく、これを行う正しい方法があれば私はそれを公開しています。 残念ながら、私が読んだところでは、XMLオブジェクトからデフォルトまたは最後の名前空間を削除できないようです。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/XML.html#removeNamespace%28%29

2

以下のソリューションをお試しください。私はregexpで文字列を置き換えるよりも良いことがわかりました。

replaceDefaultNameSpace(src, new Namespace()); //no uri 
replaceDefaultNameSpace(src, new Namespace("", "http://uri.com")); //with uri 


private function replaceDefaultNameSpace (src:XML, ns:Namespace):void 
    { 
     var tempNs:Namespace = new Namespace ("temp"); 
     var node:XML; 

     src.addNamespace(tempNs); 
     src.setNamespace(tempNs); 

     for each (node in src.descendants()) node.setNamespace(tempNs); 

     src.addNamespace(ns); 
     src.setNamespace(ns); 

     for each (node in src.descendants()) node.setNamespace(ns); 

     src.removeNamespace(tempNs); 

     trace (src.toXMLString()); 

    } 
1

私はいくつかのソリューションを試してみましたが、ここではほとんど成功しませんでした。
はここ

var myXML:XML = new XML(myString); 
for each (var ns:Namespace in myXML.namespaceDeclarations()) { 
    if (ns.prefix == 'my_namespace_prefix' || ns.uri == 'my_namespace_uri') { 
     myXML.removeNamespace(new Namespace(ns.prefix, ns.uri)); 
    } 
} 

あなたはすべての名前空間を削除するには、条件を残すことができます...私のために働いたものです。

私はあなたが ns変数で渡す場合であるとして-、中に接頭辞を残しての効果があった uriプロパティを返します文字列、に強制変換されているようですので、必要であることが新たに Namespaceオブジェクトを作成した

私のXMLデータ

元の名前空間のすべてのトレースを削除するために、この次のコードブロックを追加する必要があることがわかりました(名前空間の削除後に上記のコードが奇妙な "aaa"名前空間を生成していました)。

関連する問題