Форум 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=132604)

_SoWa 16.11.2009 14:00

Правильность XML
 
Всем привет! У меня такой вопрос: как можно отучить флеш валидировать XML?
Пример, есть XML файл с такими нодами:
Цитата:

<add_point xy="133,190,lep" text="Верхотурье">
<P>1. <STRONG>Реконструкция сетей Свердловэнерго 10-0,4 кВ в том числе "Гостевой маршрут"<BR></STRONG><EM>&nbsp;г. Верхотурье.</EM><BR><BR></P>
</add_point>
Вот HTML код внутри генерируется не мной(и даже не я писал механизмы генерации). И в этом коде есть тег <BR>, который не закрыт.

Флеш получает эту ноду, использует аттрибуты тега add_point, а затем мне надо получить внутреннее содержимое- т.е. ХТМЛ код. Точнее его надо положить в myTExtField.htmlText
Я это делаю с помощью
Код AS3:

function add_point(tempXML:XML, parentObj:MovieClip):MovieClip {
trace(tempXML.toString()); //или toXMLString, ошибка одна и та же
...
}

Для начала я пытаюсь вывести эту информацию с помощью trace
Но флеш дает ошибку:
Цитата:

TypeError: Error #1085: The element type "BR" must be terminated by the matching end-tag "</BR>".
Как можно отучить его проверять валидность содержимого, или как можно по другому достать содержимое тега, если в нем есть такие вот незакрытые теги..

SamFR 16.11.2009 14:07

<![CDATA[ ... ]]>

gloomyBrain 16.11.2009 14:08

Загрузите с помощью URLLoader, найдите и исправьте ошибку, а потом сделайте из имеемой строки XML

SamFR 16.11.2009 14:14

Нет, тут у человека проблема в том, что он хочет хранить в xml текст, включающий зарезервированные символы (тот же самый html). В данном случае нужно именно использовать тэг CDATA:
Код:

<add_point xy="133,190,lep" text="Верхотурье">
<![CDATA[<P>1. <STRONG>Реконструкция сетей Свердловэнерго 10-0,4 кВ в том числе "Гостевой маршрут"<BR></STRONG><EM>&nbsp;г. Верхотурье.</EM><BR><BR></P>]]>
</add_point>

Всё, что будет заключено в этот тег, будет интерпретироваться как текст, и, естественно, не будет подвергаться валидации и парсингу.

_SoWa 16.11.2009 14:19

Цитата:

Сообщение от SamFR (Сообщение 865894)
Всё, что будет заключено в этот тег, будет интерпретироваться как текст, и, естественно, не будет подвергаться валидации и парсингу.

Да, именно так! Спасибо большое!!!

gloomyBrain 16.11.2009 14:21

Мне кажется, что если бы человек мог редактировать скрипт, выдающий ему XML, то вопросов бы не должно было возникнуть

SamFR 16.11.2009 14:27

Цитата:

Сообщение от gloomyBrain (Сообщение 865897)
Мне кажется, что если бы человек мог редактировать скрипт, выдающий ему XML, то вопросов бы не должно было возникнуть

Если так, то дело обстоит проще: человеку просто нужно оторвать руки тому, кто писал скрипт. Шучу :)

_SoWa 16.11.2009 14:27

XML выдается хитрой связкой C#+ASP+шаблонный язык.
Лезть в тот код мне крайне неохота без огромной надобности, ибо его еще понять надо- что автор имел ввиду когда писал его...

SamFR 16.11.2009 14:34

То есть обернуть html в CDATA в скрипте никак не получится?
Тогда могу посоветовать только одно: если известно, в каких тэгах хранятся html-данные, то после загрузки файла, до преобразования его в XML, обороачивать содержимое этих тэгов тем же CDATA. А потом уже преобразовывать в XML.

_SoWa 16.11.2009 14:42

Цитата:

Сообщение от SamFR (Сообщение 865902)
То есть обернуть html в CDATA в скрипте никак не получится?
Тогда могу посоветовать только одно: если известно, в каких тэгах хранятся html-данные, то после загрузки файла, до преобразования его в XML, обороачивать содержимое этих тэгов тем же CDATA. А потом уже преобразовывать в XML.

Нет нет, как раз это я и сделал малой кровью без вмешательства в серверную часть С#+ASP. В шаблонизаторе поправил, и все хорошо работает :)

gloomyBrain 16.11.2009 14:46

Код AS3:

public var myXML:XML;
 
var uLoader:URLLoader = new URLLoader();
uLoader.addEventListener(Event.COMPLETE, onComplete);
 
private function onComplete(evt:Event) {
 
//trace(evt.target.content);
 
var str:String = evt.target.content;
str.replace("<BR>",  "");
 
myXML = new XML(str)
}

тупо... =) но работает

SamFR 16.11.2009 14:51

Цитата:

Сообщение от _SoWa (Сообщение 865904)
В шаблонизаторе поправил, и все хорошо работает :)

Ну вот и отлично)

В крайнем случае можно было сделать так (пусть теги, в которых могут храниться html-данные, перечислены в массиве htmlTags):
Код AS3:

//загруженные XML-данные
var xmlString:String = '<points>\n' +
                        '        <add_point xy="133,190,lep" text="text"><P>someText<BR>moreText</P></add_point>\n' +
                        '        <add_point/>\n' +
                        '        <another_tag>another text</another_tag>\n' +
                        '        <uru_ru text="ururu"><B>text</B><BR>text</uru_ru>\n' +
                        '</points>';
trace('"Плохой" XML:\n' + xmlString + '\n');
 
//список тегов, хранящих html-данные
var textTags:Array = ['add_point', 'uru_ru'];
 
xmlString = wrapHtml(xmlString, textTags);
trace('Исправленный XML:\n' + xmlString + '\n');
 
var xml:XML = XML(xmlString);
trace('Распарсенный XML:\n' + xml);
 
/**
 * Помещает содержимое известных XML-тегов в тег CDATA.
 *
 * @param xmlString:String Нуждающиеся в корректировке XML-данные.
 * @param tags:Array XML-теги, хранящие html-данные.
 *
 * @return Исправленные XML-данные.
 */

function wrapHtml(xmlString:String, tags:Array):String{
        var cdater:RegExp = new RegExp('<(' + tags.join('|') + ')([^>\\/]*?)>(.*?)<\\/\\1>', 'gs');
        return xmlString.replace(cdater, '<$1$2><![CDATA[$3]]></$1>');
}



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

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