2010-08-30 124 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);