2010-08-30 18 views
7

Tôi đang cố gắng phân tích một số XML trong AS3 mà tôi nhận được thông qua một cuộc gọi WebService đến C#. C# đang tuần tự hóa bằng cách sử dụng một DataContract để không gian tên là không chuẩn.Đọc XML không gian tên chuẩn không sử dụng E4X trong AS3?

Dưới đây là những gì trông giống như 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> 

Như bạn có thể nhìn thấy từ đó tôi có một tài khoản trong đó bao gồm Email, mật khẩu, giới thiệu chi tiết, và UserDetails.

Đây là nơi tôi phân tích nó và các vấn đề:

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; 

... 

Dưới đây là một ảnh chụp màn hình trong debug view (liên kết sao chép và tái view để xem lớn hơn):

alt text

Nếu không có e4x tôi có thể làm cho nó hoạt động như thế này nhưng nó thực sự là clunky:

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

Ảnh chụp màn hình:

alt text

heres SOLUTION

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

Trả lời

5

Bạn phải sử dụng tên đầy đủ (bao gồm cả không gian tên) khi có không gian tên liên quan.

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; 

Hoặc sử dụng default xml namespace chỉ

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

các tác phẩm tuyệt vời như một sự quyến rũ! –

0

Hãy thử điều này:

 
var email:XMLList = resultXml..Email; 

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

Tất nhiên bạn có thể truy cập trực tiếp EmailString với dấu chấm cú pháp !

+1

nope. không tốt: (Tôi đăng một ảnh chụp màn hình cho thấy điều này không hoạt động. –

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); 
Các vấn đề liên quan