我试图通过对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>
因此,您可以看到我有一个用户,其中包括电子邮件,密码,推荐详细信息和用户详细信息。
以下是我解析问题的地方:
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;
...
以下是调试视图中的屏幕截图(复制链接并重新查看以查看更大):
没有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();
截图:
解决方案
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();
答案 0 :(得分: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 = new Namespace("http://schemas.datacontract.org/2004/07/UserDatabaseManipulation.POCO");
var resultXml:XML = new XML(event.result);
var email:Object = resultXml.Email;
答案 1 :(得分: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);
答案 2 :(得分:0)
试试这个:
var email:XMLList = resultXml..Email; //access the user email var userEmail:String = String[email.EmailString];
当然,您可以使用点语法直接访问EmailString!