2009-03-23 5 views
2

In meiner Flex-Anwendung rufe ich mehrere .NET WebServices auf, die XML zurückgeben. Diese WebServices geben jedoch alle XML mit einem Namespace zurück. Ich kann die XML-Lese/parsen ohne den Namespace zu verweisen, was bedeutet, dass ich die folgenden Codezeilen in jeder Klasse gehören, die eine WebService nennt:Wie kann ich einen Namespace aus einem XML-Dokument entfernen?

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

use namespace PCRWebServices; 

Ich möchte die Notwendigkeit für diese statische Aufladung beseitigen/hart -codierte Logik, um einfach XML von einem WebService zu lesen.

Gibt es eine Möglichkeit, den Namespace aus dem XML zu "entfernen", so dass ich es als "normales" XML-Dokument lesen kann?

Ich habe eine Klasse, die ich für jeden WebService Aufruf verlängern, die Ergebnisse und Fehler behandelt:

private function faultHandler(event:FaultEvent):void 
{ 

} 

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

Ich mag würde eine gewisse Logik zu dem Ergebnis Handler „konvertieren“, um die XML hinzuzufügen. Irgendwelche Ideen?

Das, was trace(resultXML) kehrt:

<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> 

Antwort

2

ich diese Abhilfe gefunden, RegEx mit den Namensräumen aus dem xmlString zu entfernen.

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

Hier ist, wie ich es umgesetzt:

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

Es wird nur ein Namensraum entfernt ... –

+1

Danke. Ich sehe keinen Bedarf für den Downvote, da dies meine Frage zu "A namespace" beantwortet hat. Ich werde deine Antwort trotzdem verbessern. –

+0

Nur ein bisschen kürzer: var xmlString: String = xml.toXMLString(); \t \t \t xmlString xmlString.replace = (/ Xmlns = "[^"] + "/ g, ''); \t \t \t return new XML (xmlString); – Nux

1

Wenn Sie Verwendung Namespace angeben Sie einstellen, dass als Standard-Namespace, statt Aufruf, dass Sie den Namensraum passieren kann, wenn Sie versuchen, ein Element zuzugreifen

var myval:String = PCRWebServices::[email protected]; 
-1

Ich erinnere mich daran, einige Probleme damit zu haben. Kann mich nicht genau erinnern, wie ich gelöst habe, aber ich denke, die removeNamespace-Funktion wäre ein guter Anfang. Vielleicht so etwas wie:

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

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

ich nicht den Code überhaupt getestet haben, nur aus der Spitze von meinem Kopf.

können Sie mehr hier lesen: http://help.adobe.com/en_US/AS3LCR/Flash_10.0/XML.html#removeNamespace()

+0

Dies entfernt den Namespace aus der Namespace-Deklaration, aber es ist immer noch im XML-Dokument, und ich kann die XML-Knoten nicht ohne "Namespace verwenden ..." lesen. –

+0

Sie haben recht, anscheinend funktioniert es nicht mit allen Namensräumen (siehe das Dokument). Ich werde eine neue Lösung hinzufügen. –

3

Hier ist eine andere Regex Lösung. Es entfernt mehrere Namespaces, nicht nur einen.

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

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

Ich würde nicht die Hacks verwenden, die Namespaces aus dem XML als Zeichenfolge entfernen. Das ist ein hässlicher Hack (und ineffizient zu erwähnen). Was Sie tun können, um das Namespace in Ihrem Code nicht hart zu codieren, besteht darin, das XML-Objekt nach dem Standard-Namespace zu fragen und dieses zu verwenden. Wie folgt aus:

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

Während ich damit einverstanden, dass der geeignete Weg, mit der XML-Interaktion ist, indem er durch seinen Namensraum Adressierung, wenn Sie absichtlich versuchen, zu übersetzen oder zu konvertieren Inhalte von XML von einem Namensraum zu einem anderen (zum Beispiel , FXG zu MXML) manchmal muss man sich schmutzig machen und das XML als String hacken. Das ist keinesfalls das eleganteste und wenn es einen richtigeren Weg gibt, bin ich offen dafür. Leider von dem, was ich gelesen habe, sieht es so aus, als ob Sie den Standardnamen oder den letzten Namespace nicht von einem XML-Objekt entfernen können.

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

2

die Lösung unten versuchen. Ich fand es besser als die Zeichenfolge durch Regexp zu ersetzen.

1

Ich habe einige der hier veröffentlichten Lösungen mit marginalem Erfolg versucht.
Hier ist, was für mich gearbeitet ...

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)); 
    } 
} 

Sie können die bedingte auslassen, um alle Namensraum zu entfernen.

ich ein neues Namespace Objekt notwendig zu sein, gefunden zu schaffen, denn wenn man in der ns Variable übergeben, wie sie ist, so scheint es, in einen String dazu gezwungen zu werden, die die uri Eigenschaft gibt, die die Wirkung verlassen die Präfixe hatte in meine XML-Daten.

Ich fand es notwendig, diesen nächsten Code-Block auch hinzufügen, um alle Spuren der ursprünglichen Namespaces zu entfernen (der obige Code führte seltsame "aaa" Namespaces nach Namespace-Entfernung).