Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Странные вещи с XML'ем (http://www.flasher.ru/forum/showthread.php?t=202982)

dabar347 23.08.2013 16:09

Странные вещи с XML'ем
 
Имеется загружаемый флешем XML вот такого содержания.
Код AS3:

<string xmlns="http://www.payproglobal.com/">
<LicenseInfo Valid="true">
<CustomerEmail>test@payproglobal.com</CustomerEmail>
<CustomerName>John Doe</CustomerName>
<ProductName>Paw-Paw Creator</ProductName>
<Key>GAEG-BDHR-FPYR-ADFT</Key>
<TotalUsages>1</TotalUsages>
<UsagesLeft>0</UsagesLeft>
<PurchaseDate>8/23/2013</PurchaseDate>
<OrderReferenceNumber>1670098-001-1UT</OrderReferenceNumber>
<CanBeActivated>False</CanBeActivated>
</LicenseInfo>
</string>

XML загружается в переменную xmlLoader. Затык произошел с выводом. Я хочу получить значение атрибута Valid элемента LicenseInfo. Пытаюсь вывести это такими вариантами
Код AS3:

trace(xmlLoader.LicenseInfo.@Valid[0]);//undefined
trace(xmlLoader.@Valid[0]);//undefined
trace(xmlLoader.LicenseInfo[0].@Valid[0]);//Кидает эксепшн TypeError: Error #1010: A term is undefined and has no properties.

В общем одно сплошное расстройство.

GBee 23.08.2013 16:10

Код AS3:

xmlLoader.LicenseInfo[0].@Valid

Уот так уот.

dabar347 23.08.2013 16:19

А вот и нет.
trace(xmlLoader.LicenseInfo[0].@Valid)//кидает ошибку как выше
trace(xmlLoader.LicenseInfo[0])//undefined, несморя на то, что он есть в документе.

Wolsh 23.08.2013 16:32

Покажите, как создается и как инициализируется переменная со странным именем xmlLoader

SvetozarPNZ 23.08.2013 16:47

Второй трейс неправильно обращается, а вот первый и третий должны срабатывать.
Попробуйте корневой тег в XML сделать без атрибутов. Я с этим сталкивался и только так проблема решилась. Но я так и не нашел, почему в AS такая ерунда. Если кто знает, напишите.

Код AS3:

<string xmlns="http://www.payproglobal.com/">
 ...
</string>


maxkar 23.08.2013 17:02

Вещи не странные, а абсолютно разумные. Нет у вашего xml элемента LicenceInfo. Есть элемент "http://www.payproglobal.com/"::LicenseInfo. Раз уж сделали namespace, нужно уметь с ним работать.

А так - все элементарно:
Код AS3:

package {
import flash.display.*;
import flash.text.*;
 
public class NST extends Sprite {
  public function NST() {
 
    const xml : XML =<string xmlns="http://www.payproglobal.com/">
<LicenseInfo Valid="true">
</LicenseInfo>
</string>;
 
    namespace ns = "http://www.payproglobal.com/";
 
    const tf : TextField = new TextField();
    addChild(tf);
    tf.text = "Wow:" + xml.ns::LicenseInfo.@Valid[0];
  }
}
}


GBee 23.08.2013 17:54

оу, а слона неймспейс я и не заметил

dabar347 23.08.2013 22:36

Хм.. Окей. Теперь ясно. Неймспейсы создавал не я а сервер, но теперь понятно.

Добавлено через 29 минут
А вот и нет. Пример от maxkar работает, но только с упрощенными данными. Полный ответ сервера звучит так.
Код:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.payproglobal.com/">&lt;LicenseInfo Valid="true"&gt;
  &lt;CustomerEmail&gt;test@payproglobal.com&lt;/CustomerEmail&gt;
  &lt;CustomerName&gt;John Doe&lt;/CustomerName&gt;
  &lt;ProductName&gt;Paw-Paw Creator&lt;/ProductName&gt;
  &lt;Key&gt;GAEG-BDHR-FPYR-ADFF&lt;/Key&gt;
  &lt;TotalUsages&gt;1&lt;/TotalUsages&gt;
  &lt;UsagesLeft&gt;0&lt;/UsagesLeft&gt;
  &lt;PurchaseDate&gt;8/23/2013&lt;/PurchaseDate&gt;
  &lt;OrderReferenceNumber&gt;1670098-001-1UT&lt;/OrderReferenceNumber&gt;
  &lt;CanBeActivated&gt;False&lt;/CanBeActivated&gt;
&lt;/LicenseInfo&gt;</string>

Но если я пытаюсь оттрейсить принятые данные то получаю в консоли вот это:
Код:

<LicenseInfo Valid="true">

  <CustomerEmail>test@payproglobal.com</CustomerEmail>

  <CustomerName>John Doe</CustomerName>

  <ProductName>Paw-Paw Creator</ProductName>

  <Key>GAEG-BDHR-FPYR-ADFF</Key>

  <TotalUsages>1</TotalUsages>

  <UsagesLeft>0</UsagesLeft>

  <PurchaseDate>8/23/2013</PurchaseDate>

  <OrderReferenceNumber>1670098-001-1UT</OrderReferenceNumber>

  <CanBeActivated>False</CanBeActivated>

</LicenseInfo>

Все форматирование сохранено. Запрашиваю данные:
Код AS3:

xmlLoader.load(new URLRequest("https://www.payproglobal.com/passport/service.asmx/ValidateLicense?ProductID=137951&CustomerEmail="+email+"&ActivationKey="+key));

В функции-хендлере вынимаю данные из лоадера:
Код AS3:

var xmlLoader:XML = XML((event.currentTarget as URLLoader).data);

Ну а дальше непонятно почему я вижу не весь XML

maxkar 23.08.2013 23:19

Стоп! Вас &lt; не смущают? Если вы ничего не перепутали, то у вас весь XML содержит ровно один элемент "http://www.payproglobal.com/"::string. Все остальное это один (или несколько, я спецификацию не учил) text node. В том текстовом узле содержится "произвольный текст", и с точки зрения всех инструментов, он является именно "текстом", а не набором элементов/атрибутов и т.п.. А в трейс вы выводите внутреннее содержимое. Попробуйте toXMLString вместо toString выводить. Вот для него как раз все нормально должно быть.

Т.е. "<<<" в элементе test при записи в XML будет выглядеть как
Код:

<test>&lt;&lt;&lt;</test>
А вот при печати все будет зависеть от того, каким именно вы его выводите.

Так что у вас все парсится нормально. Правильнее всего исправить сервер (чтобы он не строку отдавал, а само значение). Но если не получается, вам нужно выбирать дочерний для корневого элемент (он должен быть типа "текст") и затем еще раз его парсить. Ну и проверить, что будет, если в ответе есть несколько LicenseInfo.


Часовой пояс GMT +4, время: 01:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.