parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

XmlParser.p: Обновленный класс для работы с XML включая XML-RPC

dmx102 22.07.2006 21:24 / 22.07.2006 21:25

# $Id: XmlParser.p,v 1.0.0.0 2006/07/17 Seomin Kirill Exp $


@CLASS
XmlParser


@create[]
$self.status(true)


#Ввод


@doXmlNew[docName;tag]
^try{
	$self.status(true)
	$self.$docName[^xdoc::create[$tag]]
}{
	$exception.handled(true)
	$self.status(false)
}


@doXmlLoad[docName;fileName]
^try{
	$self.status(true)
	$self.$docName[^xdoc::load[$fileName]]
}{
	$exception.handled(true)
	$self.status(false)
}


@getXmlRpc[docName]
^try{
	$self.status(true)
	$self.$docName[^xdoc::create{^untaint[as-is]{$request:body}}]
}{
	$exception.handled(true)
	$self.status(false)
}


#Узлы


@getNodeSelectFirst[docName;path][nodeList]
^try{
	$self.status(true)
	$nodeList[^self.$docName.select[$path]]
	$result[$nodeList.0]
}{
	$exception.handled(true)
	$self.status(false)
}


@doNodeAdd[docName;path;tag;value][node;nodeNew;nodeNewValue;temp]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$nodeNew[^self.$docName.createElement[$tag]]
	$temp[^node.appendChild[$nodeNew]]
	$result(true)
	^if(def $value){
		$nodeNewValue[^self.$docName.createTextNode[$value]]
		$nodeNew[^getNodeSelectFirst[$docName;$path/$tag]]
		$temp[^nodeNew.appendChild[$nodeNewValue]]
	}
}{
	$exception.handled(true)
	$self.status(false)
}


@doNodeDel[docName;path][node;nodeParent;temp]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$nodeParent[$node.parentNode]
	$temp[^nodeParent.removeChild[$node]]
}{
	$exception.handled(true)
	$self.status(false)
}


@setNodeValue[docName;path;value][node]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$node.firstChild.nodeValue[$value]
}{
	$exception.handled(true)
	$self.status(false)
}


@doNodeCopy[docNameFrom;pathFrom;docNameTo;pathTo][nodeFrom;nodeNew;nodeTo;temp]
^try{
	$self.status(true)
	$nodeFrom[^getNodeSelectFirst[$docNameFrom;$pathFrom]]
	$nodeNew[^self.$docNameTo.importNode[$nodeFrom](-1)]
	$nodeTo[^getNodeSelectFirst[$docNameTo;$pathTo]]
	$temp[^nodeTo.appendChild[$nodeNew]]
}{
	$exception.handled(true)
	$self.status(false)
}


@getNodeValue[docName;path][node]
^try{
	$self.status(true)
	$node[^self.getNodeSelectFirst[$docName;$path]]
	$result[$node.firstChild.nodeValue]
}{
	$exception.handled(true)
	$self.status(false)
}


#Атрибуты


@doAttrAdd[docName;path;attr;value][node;attrNew;attrNewValue;temp]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$attrNew[^self.$docName.createAttribute[$attr]]
	$temp[^node.appendChild[$attrNew]]
	^if(def $value){
		$attrNewValue[^self.$docName.createTextNode[$value]]
		$attrNew[^getNodeSelectFirst[$docName;$path/@$attr]]
		$temp[^attrNew.appendChild[$attrNewValue]]
	}
}{
	$exception.handled(true)
	$self.status(false)
}


@doAttrDel[docName;path;attr][node;temp]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$temp[^node.removeAttribute[$attr]]
}{
	$exception.handled(true)
	$self.status(false)
}


@setAttrValue[docName;path;attr;value][node;temp]
^try{
	$self.status(true)
	$node[^getNodeSelectFirst[$docName;$path]]
	$temp[^node.setAttribute[$attr;$value]]
}{
	$exception.handled(true)
	$self.status(false)
}


@getAttrValue[docName;path;attr][node]
^try{
	$self.status(true)
	$node[^self.getNodeSelectFirst[$docName;$path]]
	$result[^node.getAttribute[$attr]]
}{
	$exception.handled(true)
	$self.status(false)
}


#Вывод


@doXmlSave[docName;fileName]
^try{
	$self.status(true)
	^self.$docName.save[$fileName]
}{
	$exception.handled(true)
	$self.status(false)
}


@getXmlXslt[docName;fileName][xslt]
^try{
	$self.status(true)
	$xslt[^self.$docName.transform[$fileName]]
	$result[^xslt.string[$.method[html]]]
}{
	$exception.handled(true)
	$self.status(false)
}


@getXmlPrint[docName]
^try{
	$self.status(true)
	$result[^self.$docName.string[]]
}{
	$exception.handled(true)
	$self.status(false)
}


@setXmlRpc[docName]
^try{
	$self.status(true)
	$response:content-type[$.value[text/xml]$.charset[$response:charset]]
	$response:body[^self.$docName.string[]]
}{
	$exception.handled(true)
	$self.status(false)
}

=============================
Комментарии к классу
=============================

@create[]
#Без комментариев

Создание XML документов

@doXmlNew[docName;root]
#Создание нового документа с сылкой-именем $docName, $root - корневой узел док-та

@doXmlLoad[docName;fileName]
#Загрузка XML док-та из источника $fileName в $docName

@getXmlRpc[docName;flag]
#Получение XML запроса в $docName

Узлы созданных ранее док-тов

@getNodeSelectFirst[docName;path]
#Получение первого узла-элемента из $docName по указанному пути $path - XPath 

@doNodeAdd[docName;path;tag;value]
#Добавление узла по адресу $path в $docName, где имя нового узла $tag, с необязательным текстовым содержимым $value

@doNodeDel[docName;path]
#Удаление узла из $docName по пути $path

@setNodeValue[docName;path;value]
#Изменяем значение текстового значения узла по адресу $path в док-те $docName, на новое значение $value ($path должен указывать на узел)

@doNodeCopy[docNameFrom;pathFrom;docNameTo;pathTo]
#Копирование узла $docNameFrom по адресу $pathFrom в док-т $docNameTo по адресу $pathTo

@getNodeValue[docName;path]
#Получаем текстовое содержание узла по адресу $path в док-те $docName

Атрибуты узлов

@doAttrAdd[docName;path;attr;value]
#Добавляем аттрибут в док-т $docName по адресу $path с именем атрибута $attr и его не обязательным значением $value

@doAttrDel[docName;path;attr]
#Удаляем атрибут из документа $docName по адресу $path (указатель на материнский узел, где расположен атрибут $attr)

@setAttrValue[docName;path;attr;value]
#Устанавливаем значение атрибута из док-та $docName по адресу $path, где атрибут $attr и новое значение $value

@getAttrValue[docName;path;attr]
#Получаем значение атрибута из док-та $docName по адресу $path аттрибута $attr

Вывод

@doXmlSave[docName;fileName]
#Сохраняем XML в чистом виде из док-та $docName в файл $fileName

@getXmlXslt[docName;fileName]
#Предобразуем док-т $docName к xsl таблице $fileName

@getXmlPrint[docName]
#Выводим на экран чистый XML из $docName

@setXmlRpc[docName]
#Делает ответ сервера в виде XML из $docName

status - проверка успешности выполнения предъидущего оператора из класса(true;false)