Luk*_*ina 7 xml flash e4x actionscript-3
我试图通过对C#的WebService调用来解析AS3中的一些XML.C#使用DataContract进行序列化,因此命名空间是非标准的.
这是xml的样子:
<User xmlns="http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Email>
<EmailString>
bill@whitehouse.gov
</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>
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到我有一个用户,其中包括电子邮件,密码,推荐详细信息和用户详细信息.
这是我解析它和问题的地方:
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;
...
Run Code Online (Sandbox Code Playgroud)
这是调试视图中的屏幕截图(复制链接并重新查看以查看更大):

没有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();
Run Code Online (Sandbox Code Playgroud)
截图:

解决方案
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();
Run Code Online (Sandbox Code Playgroud)
当涉及名称空间时,您必须使用完全限定名称(包括命名空间).
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;
Run Code Online (Sandbox Code Playgroud)
或者使用默认的xml命名空间指令
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2333 次 |
| 最近记录: |