2010-08-30 16 views
7

Ich versuche, einige XML in AS3 zu analysieren, die ich durch einen WebService-Aufruf an C# erhalte. C# serialisiert mit einem DataContract, so dass der Namespace nicht standardisiert ist.Nicht Standard-Namespace XML mit E4X in AS3 lesen?

Hier ist, was die XML wie folgt aussieht:

<User xmlns="http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Email> 
    <EmailString> 
     [email protected] 
    </EmailString> 
    </Email> 
    <Password> 
    <PasswordPlainText> 
     password 
    </PasswordPlainText> 
    </Password> 
    <ReferralDetails> 
    <ReferralEmail/> 
    <ServiceCreatedAt> 
     google 
    </ServiceCreatedAt>  
    </ReferralDetails> 
    <UserDetails> 
    <Address> 
     Penn Ave 
    </Address> 
    <City> 
     Washington DC 
    </City> 
    <Country> 
     USA 
    </Country> 
    <FirstName> 
     Bill 
    </FirstName> 
    <LastName> 
     Clinton 
    </LastName> 
    <State> 
     AK 
    </State> 
    <Zip> 
     11111 
    </Zip> 
    </UserDetails> 
</User> 

So wie man es von sehen, dass ich einen Benutzer haben, die von E-Mail, Passwort besteht, Referral-Details und Userdetails.

Hier ist, wo ich es und das Problem zu analysieren:

private function onResult(event:ResultEvent):void 
     {   
      var n:Namespace = new Namespace("http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO"); 
      use namespace n;      

//This WORKS! ResultXml is loaded with the correct looking XML. 
      var resultXml:XML = new XML(event.result); 

//This doesnt work! I just end up with an empty XMLList. 
      var email:Object = resultXml.Email; 

... 

Hier ist ein Screenshot im Debug-Ansicht (Link kopieren und wieder Ansicht es größer zu sehen):

alt text

Ohne e4x kann ich es so arbeiten, aber es ist wirklich klobig:

var resultXml:XML = new XML(event.result); // the whole block of XML 

      var email:XML = resultXml.children()[0]; // the email object XML 

      var emailText:XML = email.children()[0]; // the email text 

      var emailActualXml:XML = emailText.children()[0]; // the email string in xml 

      var emailString:String = emailActualXml.toString(); 

Screenshot:

alt text

HERES DIE LÖSUNG

var xmlNamespace:Namespace = new Namespace(// namespace in here);   

      var resultXml:XML = new XML(event.result);   

      var email:XMLList = resultXml.xmlNamespace::Email; 

      var emailString:Object = email.xmlNamespace::EmailString.text().toString(); 

Antwort

5

Sie müssen den vollständig qualifizierten Namen (einschließlich des Namespace) verwenden, wenn Namespaces betroffen sind.

var n:Namespace = new Namespace("http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO"); 
var resultXml:XML = new XML(event.result); 
var email:Object = resultXml.n::Email; 

oder verwenden Sie die default xml namespace Richtlinie

default xml namespace = new Namespace("http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO"); 

var resultXml:XML = new XML(event.result); 
var email:Object = resultXml.Email; 
+0

toll funktioniert wie ein Charme! –

0

Try this:

 
var email:XMLList = resultXml..Email; 

//access the user email 
var userEmail:String = String[email.EmailString]; 

Natürlich können Sie direkt mit der Punktsyntax zugreifen konnte EmailString !

+1

Nö. nicht gut :(Ich postete einen Screenshot zeigt dies funktioniert nicht. –

1
<?xml version="1.0" encoding="UTF-8"?> 
    <manifest xmlns="http://ns.adobe.com/f4m/1.0"> 
     <id> 
    video_400 
     </id> 
     <streamType> 
      recorded 
     </streamType> 
     <duration> 
     87.823999999999998 
     </duration> 
     <bootstrapInfo profile="named" id="bootstrap9368"> 
     <metadata> 
      ele mele 
     </metadata> 
     </bootstrapInfo> 
    </manifest> 



var xmlData:XML = new XML(loader.content as String) ; 
var f4mNs : Namespace = xmlData.namespace(); 
trace(this + " onQueueComplete DURATION= " + xmlData.f4mNs::duration);