|
|
|||||
ветеран форума
|
Как добавить узел в XML
Необходимо добавить узел с задаваемым именем и атрибутами в XML.
Подскажите, плиз, пару моментов... НаписАл вот такое: public static function addChapter($xml:XML, $name:String, $attrib:Object = null):XML { $xml.appendChild( <{$name}> </{$name}> ); var tmpNode:XML = $xml[$name][$xml[$name].length() - 1]; for (var prop:String in $attrib) { tmpNode.@[prop] = $attrib[prop]; } return $xml; } И еще вопрос: как вставить этот узел в определенную позицию, например, именно 3-м или 12-м (учитывая что узлы с таким же именем уже существуют)?
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
Modus ponens
|
function addChapter(xml:XML, name:String, attrib:Object = null):XML { if(!isXMLName(name)) return <error/>; xml.appendChild(<{name} {attribsToString(attrib)}/>); return xml; } function attribsToString(obj:Object = null):String { var ret:String = ""; if (obj === null) return ret; if (obj is XML) { for each(var node:XML in obj.@*) { ret += node.name() + "=\"" + node.toXMLString() + "\" "; } return ret; } for (var p:String in obj) { ret += p + "=\"" + obj[p] + "\" "; } return ret; } var foo:XML = <foo/>; trace(addChapter(foo, "chapter", { bar: "1234" }).toXMLString()); trace(addChapter(foo, "chapter", <bar bar="4321"/>).toXMLString()); trace(addChapter(foo, "chapter").toXMLString()); trace(addChapter(foo, "@", <bar bar="4321"/>).toXMLString()); Да, и еще не понятно, как поступать с примитивами в таком случае (типа Boolean / Number если их передать последним параметром).
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.04.2009 в 03:55. |
|
|||||
ветеран форума
|
Огромное спасибо. Вышло посложнее, но видимо правильней.
Все же непонятны пару моментов: Цитата:
Цитата:
И как все же вставлять в нужную позицию нужный узел?
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 26.04.2009 в 04:39. |
|
|||||
Modus ponens
|
А какая позиция "нужная"? Не боюсь показаться пошлым
$ нужно ставить перед именем метода или геттера / сеттера (не свойства) в том случае если: - вы оверрайдите метод супер-класса - вы хотите оставить метод суперкласса доступным для дальнейших потомков этого класса. Пример: Дело в том, что последним параметром вы можете передать не [object Object] а Boolean например, в таком случае ничего не добавится - т.е. функция не выдаст исключения, но и ничего не произойдет. Вероятность того, что вам это будет нужно не большая, но если уж писать классы утилит, то лучше предусматривать заранее все возможные варианты, а не только те, которые нужны именно сейчас.
__________________
Hell is the possibility of sanity |
|
|||||
ветеран форума
|
Ну, например, есть у меня в XML 23 узла <clipart/>, а мне нужно добавить еще один именно 17-м, а не в самый конец. Или тот что есть последним, переместить на другую позицию, есть способ который это сделает?
С остальным понятно, обдумаю как время будет
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
Modus ponens
|
__________________
Hell is the possibility of sanity |
|
|||||
ветеран форума
|
Не... ну эт понятно
Я вот как то так пытаюсь, в одной функции пока чет не складывается, пришлось отдельную сделать: // В довесок к Вашему вышеприведенному коду function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML { if (!isXMLName(name)) return <error/>; var insertNode:* = <{name} {attribsToString(attrib)}/> //TODO: Добавить проверку на пределы pos if (xml[name][pos] != undefined) { insertNode += xml[name][pos].copy(); xml[name][pos] = insertNode; } else { xml.appendChild(insertNode); } return xml; }
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 26.04.2009 в 06:37. |
|
|||||
Modus ponens
|
insertNode никогда не будет другого типа кроме XML зачем ему звездочка? =/
Если чесно, я не совсем понимаю назначение этой функции - зачем она нужна, когда есть штатная которая делает то же самое?
__________________
Hell is the possibility of sanity |
|
|||||
ветеран форума
|
Чтоб не создавать заранее какой то узел, а сделать все в одной функции: и нужный узел создать с требуемыми именем и атрибутами и на указанную позицию его разместить )
function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML { if (!isXMLName(name)) return <error/>; var insertNode:* = <{name} {attribsToString(attrib)}/> if (xml[name] == undefined) { xml.appendChild(insertNode); return xml; } if (pos < 0) pos = 0; if (pos > xml[name].length() - 1) pos = xml[name].length() - 1; insertNode += xml[name][pos].copy(); xml[name][pos] = insertNode; return xml; }
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
Modus ponens
|
function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML { if (!isXMLName(name)) return <error/>; var insertNode:XML = <{name} {attribsToString(attrib)}/>; if (!xml.*.length()) return xml.appendChild(insertNode); pos = pos < 0 ? 0 : pos; pos = pos > xml.*.length() - 1 ? xml.*.length() : pos; xml.insertChildBefore(xml.*[pos], insertNode); return xml; } function attribsToString(obj:Object = null):String { var ret:String = ""; if (obj === null) return ret; if (obj is XML) { for each(var node:XML in obj.@*) { ret += node.name() + "=\"" + node.toXMLString() + "\" "; } return ret; } for (var p:String in obj) { ret += p + "=\"" + obj[p] + "\" "; } return ret; } var foo:XML = <foo/>; trace(addChapterAt(foo, "chapter", 100, { bar: "1234" }).toXMLString()); trace(addChapterAt(foo, "chapter", -50, <bar bar="4321"/>).toXMLString()); trace(addChapterAt(foo, "chapter", 1).toXMLString()); trace(addChapterAt(foo, "@", 0, <bar bar="4321"/>).toXMLString());
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.04.2009 в 15:20. |
Часовой пояс GMT +4, время: 13:19. |
|
« Предыдущая тема | Следующая тема » |
|
|