Чтение нестандартного пространства имен XML с использованием E4X в AS3?

Я пытаюсь проанализировать некоторый XML в AS3, который я получаю через вызов WebService для C #. 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;

...

Вот снимок экрана в режиме отладки (скопируйте ссылку и пересмотрите, чтобы увидеть его побольше):

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();
7
задан Luke Belbina 30 August 2010 в 05:23
поделиться

2 ответа

Вы должны использовать полное имя (включая пространство имен), когда задействованы пространства имен.

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;

Или используйте директиву пространства имен 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;
5
ответ дан 7 December 2019 в 09:55
поделиться

Попробуйте это:

var email:XMLList = resultXml..Email;

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

Конечно, вы можете получить доступ к EmailString напрямую, используя синтаксис точки!

0
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: