2010-08-30 55 views
7

我想解析AS3中的一些XML,我通過WebService調用C#。 C#使用DataContract進行序列化,因此命名空間是非標準的。在AS3中使用E4X讀取非標準名稱空間XML?

這裏是XML的樣子:

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

所以你可以從我有其中包括電子郵件,密碼,轉診詳細信息,並且是UserDetails的用戶看到。

這裏是我分析它和問題:

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; 

... 

下面是調試視圖的屏幕截圖(複製鏈接和重新視圖來查看它更大的):

alt text

沒有e4x我可以像這樣工作,但它確實很笨重:

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

截圖:

alt text

繼承人的解決方案

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

回答

5

當涉及名稱空間時,您必須使用完全限定名稱(包括名稱空間)。

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; 

或者使用default xml namespace指令

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

偉大的作品就像一個魅力! – 2010-08-30 05:23:15

0

試試這個:

 
var email:XMLList = resultXml..Email; 

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

當然你可以直接訪問與點語法都是EmailString中!

+1

都能跟得上。沒有好處:(我張貼了一個屏幕截圖,顯示這不起作用。 – 2010-08-30 02:54:00

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