[JS, Rhino] DOM support

kill-still

Есть среда, в которой можно выполнять скрипты, написанные на javascript. Выполняются они на Rhino. Появилась необходимость работать в этих скриптах с XML в виде DOM-а. Можете что-нибудь посоветовать?

luna89

В Rhino все java-библиотеки доступны, в чем проблема?

artimon

А там нет E4X?

kill-still

Собственно можно редактировать только тело скрипта. :)

kill-still

Во, спасибо, есть. :) А то я уже собрался вот эту хрень тащить внутрь: http://github.com/jindw/xmldom

kill-still

в русской википедии пример ржачный: http://ru.wikipedia.org/wiki/ECMAScript_%D0%B4%D0%BB%D1%8F_X...

luna89

Собственно можно редактировать только тело скрипта.
А что еще есть у скрипта кроме тела? :confused:

kill-still

Что-то у них парсер спотыкается на такой ерунде как &ndash &nbsp &laquo &raquo и пр. :(

artimon

Ну там XML-парсер, в нём нет всех этих entity. И задать кажется нельзя. E4X всё-таки заброшен…

kill-still

Ну, что поделаешь - заменю на   распарсю, преобразую, .toString(), а потом обратно заменю.

kill-still

Странный этот e4x какой-то. Мне надо взять все значения атрибутов с определённым именем и преобразовать их. Выбрать их очень легко:
var selector = myXMLList..@myAttributeName;
selector[0] = 'test'; // - а вот присвоить отсюда нельзя. (или можно?)

ок, тогда выберем все элементы (благо такой атрибут содержат только один тип элементов):
var selector = myXMLList..myElementName
for (var i in selector )
selector[i].@myAttributeName = transform(selector[i].@myAttributeName);

Но тут другая бяка вылазит - если рутовый элемент в XMLList является myElementName, то в селектор он не попадает. Пока что ничего не придумал, кроме как обернуть всё в <test>...</test>, а потом просто взять .childs()
Но это как-то не здорово. Может кто подскажет, как распрямить клешни?

artimon

Странно у меня работает

var xml = <a x="foo">
<b x="bar"/>
</a>;
Writer.write(xml.toXMLString() + '\n');
var attrs = xml..@x;
for (var i = 0; i < attrs.length(); i++) {
attrs[i] = 'n' + i;
}
Writer.write(xml.toXMLString());


<a x="foo">
<b x="bar"/>
</a>
<a x="n0">
<b x="n1"/>
</a>Bye!

kill-still

Твой пример тоже не работает.
P.S.
        <dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.7R3</version>
</dependency>

artimon

Ну может у тебя слишком старый или слишком новый. Я вообще не знаю какая у меня версия :)

kill-still

вроде последняя версия 1.7R4, так что я хз.

kill-still

Слушай, а такой код что у тебя вернёт?
var xml = <a x="foo">
<a x="bar"/>
</a>;

var attrs = xml..a;

for (var i = 0; i < attrs.length(); i++) {
attrs[i].@x = 'n' + i;
}
Alert(xml.toXMLString());

у меня
---------------------------
Alert
---------------------------
<a x="foo">
<a x="n0"/>
</a>
---------------------------
ОК Отмена
---------------------------

artimon

То же самое. Ну ты же нашёл решение с оборачиванием в тег

kill-still

Сейчас только два типа элементов содержит атрибут, а теоретически их может быть больше. Завёл им жиру, посмотрю, что ответят.

artimon

Там вроде есть предикаты

xml..*.(@x) // такой у меня не заработал
xml..*.(function::attribute('x')) // выбрал все элементы у которых есть атрибут x

kill-still

я пробовал конструкции вида .()
ни одна не взлетела - все ошибку "компиляции" выдают.
Оставить комментарий
Имя или ник:
Комментарий: