`
#rethink#
  • 浏览: 47433 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

DOMComment 和 DOMXPath的应用sample

阅读更多

symfony 1.0版本中的表单重填(当提交表单出现error的时候,要在表单中显示之前用户的输入)中的核心类:

/lib/symfony/util/sfFillInForm.class.php

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  1 <?php
  2 
  3 /*
  4  * This file is part of the symfony package.
  5  * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
  6  *
  7  * For the full copyright and license information, please view the LICENSE
  8  * file that was distributed with this source code.
  9  */
 10 
 11 /**
 12  *
 13  * @package    symfony
 14  * @subpackage util
 15  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
 16  * @version    SVN: $Id: sfFillInForm.class.php 2976 2006-12-08 19:11:36Z fabien $
 17  */
 18 class sfFillInForm
 19 {
 20   protected
 21     $converters  = array(),
 22     $skipFields  = array(),
 23     $types       = array('text', 'checkbox', 'radio', 'hidden', 'password');
 24 
 25   public function addConverter($callable, $fields)
 26   {
 27     foreach ((array$fields as $field)
 28     {
 29       $this->converters[$field][] = $callable;
 30     }
 31   }
 32 
 33   public function setSkipFields($fields)
 34   {
 35     $this->skipFields = $fields;
 36   }
 37 
 38   public function setTypes($types)
 39   {
 40     $this->types = $types;
 41   }
 42 
 43   public function fillInHtml($html, $formName, $formId, $values)
 44   {
 45     $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
 46     @$dom->loadHTML($html);
 47 
 48     $dom = $this->fillInDom($dom, $formName, $formId, $values);
 49 
 50     return $dom->saveHTML();
 51   }
 52 
 53   public function fillInXml($xml, $formName, $formId, $values)
 54   {
 55     $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
 56     @$dom->loadXML($xml);
 57 
 58     $dom = $this->fillInDom($dom, $formName, $formId, $values);
 59 
 60     return $dom->saveXML();
 61   }
 62 
 63   public function fillInDom($dom, $formName, $formId, $values)
 64   {
 65     $xpath = new DomXPath($dom);
 66 
 67     $query = 'descendant::input[@name and (not(@type)';
 68     foreach ($this->types as $type)
 69     {
 70       $query .= ' or @type="'.$type.'"';
 71     }
 72     $query .= ')] | descendant::textarea[@name] | descendant::select[@name]';
 73 
 74     // find our form
 75     if ($formName)
 76     {
 77       $xpath_query = '//form[@name="'.$formName.'"]';
 78     }
 79     elseif ($formId)
 80     {
 81       $xpath_query = '//form[@id="'.$formId.'"]';
 82     }
 83     else
 84     {
 85       $xpath_query = '//form';
 86     }
 87 
 88     $form = $xpath->query($xpath_query)->item(0);
 89     if (!$form)
 90     {
 91       if (!$formName && !$formId)
 92       {
 93         throw new sfException('No form found in this page');
 94       }
 95       else
 96       {
 97         throw new sfException(sprintf('The form "%s" cannot be found', $formName ? $formName : $formId));
 98       }
 99     }
100 
101     foreach ($xpath->query($query, $formas $element)
102     {
103       $name  = (string$element->getAttribute('name');
104       $value = (string$element->getAttribute('value');
105       $type  = (string$element->getAttribute('type');
106 
107       // skip fields
108       if (!$this->hasValue($values, $name|| in_array($name, $this->skipFields))
109       {
110         continue;
111       }
112 
113       if ($element->nodeName == 'input')
114       {
115         if ($type == 'checkbox' || $type == 'radio')
116         {
117           // checkbox and radio
118           $element->removeAttribute('checked');
119           if ($this->hasValue($values, $name&& ($this->getValue($values, $name== $value || !$element->hasAttribute('value')))
120           {
121             $element->setAttribute('checked', 'checked');
122           }
123         }
124         else
125         {
126           // text input
127           $element->removeAttribute('value');
128           if ($this->hasValue($values, $name))
129           {
130             $element->setAttribute('value', $this->escapeValue($this->getValue($values, $name), $name));
131           }
132         }
133       }
134       else if ($element->nodeName == 'textarea')
135       {
136         $el = $element->cloneNode(false);
137         $el->appendChild($dom->createTextNode($this->escapeValue($this->getValue($values, $name), $name)));
138         $element->parentNode->replaceChild($el, $element);
139       }
140       else if ($element->nodeName == 'select')
141       {
142         // select
143         $value    = $this->getValue($values, $name);
144         $multiple = $element->hasAttribute('multiple');
145         foreach ($xpath->query('descendant::option', $elementas $option)
146         {
147           $option->removeAttribute('selected');
148           if ($multiple && is_array($value))
149           {
150             if (in_array($option->getAttribute('value'), $value))
151             {
152               $option->setAttribute('selected', 'selected');
153             }
154           }
155           else if ($value == $option->getAttribute('value'))
156           {
157             $option->setAttribute('selected', 'selected');
158           }
159         }
160       }
161     }
162 
163     return $dom;
164   }
165 
166   protected function hasValue($values, $name)
167   {
168     if (array_key_exists($name, $values))
169     {
170       return true;
171     }
172 
173     return null !== sfToolkit::getArrayValueForPath($values, $name);
174   }
175 
176   protected function getValue($values, $name)
177   {
178     if (array_key_exists($name, $values))
179     {
180       return $values[$name];
181     }
182 
183     return sfToolkit::getArrayValueForPath($values, $name);
184   }
185 
186   protected function escapeValue($value, $name)
187   {
188     if (function_exists('iconv'&& strtolower(sfConfig::get('sf_charset')) != 'utf-8')
189     {
190       $new_value = iconv(sfConfig::get('sf_charset'), 'UTF-8', $value);
191       if (false !== $new_value)
192       {
193         $value = $new_value;
194       }
195     }
196 
197     if (isset($this->converters[$name]))
198     {
199       foreach ($this->converters[$nameas $callable)
200       {
201         $value = call_user_func($callable, $value);
202       }
203     }
204 
205     return $value;
206   }
207 }
208 

 

 

分享到:
评论

相关推荐

    dom+xpath读取xml并导入oracle.rar

    在Java中,我们可以使用javax.xml.xpath.XPath和XPathConstants类来执行XPath查询: ```java import javax.xml.xpath.*; import org.w3c.dom.NodeList; import org.w3c.dom.Node; XPathFactory xPathFactory = ...

    dom4j和xpath的jar包

    "jom4j_xpath"这个压缩包很可能包含了DOM4J和XPath的相关库文件,可能还包括相关的示例代码或文档,以帮助开发者快速理解和应用这两个工具。 使用这些库时,首先需要在项目中引入相应的jar包。对于Maven项目,可以...

    PyPI 官网下载 | py_dom_xpath_six-0.2.4-py3-none-any.whl

    `py_dom_xpath_six`库结合了XPath和DOM的概念,为Python开发者提供了一个高效且易于使用的工具,用于解析和操作XML文档。通过PyPI下载的`.whl`文件,用户可以快速安装并在项目中集成这个库,提升XML处理的效率。了解...

    dom4j 和xpath

    DOM4J和XPath是XML处理领域中的两个重要概念,它们在Java编程中有着广泛的应用。DOM4J是一款灵活且功能强大的Java库,主要用于处理XML文档,而XPath是一种在XML文档中查找信息的语言。 DOM4J简介: DOM4J是基于Java...

    dom4j和xpath必备jar包

    在实际应用中,"dom4j和xpath必备jar包"通常包含了DOM4J库和XPath相关的类库,如Java的JAXP(Java API for XML Processing)的一部分,这些库文件是Java项目中解析和操作XML所必需的依赖。将这些jar包添加到项目的类...

    DOM XPATH获取img src值的query

    综上所述,通过DOM和XPATH获取img标签的src值涉及到了对DOM模型的理解、XPATH表达式的编写,以及对返回结果的正确处理。掌握这些知识点,可以有效地从静态HTML文档中提取图片资源的URL地址,为网页内容抓取和数据...

    dom+xpath的jar

    在IT行业中,DOM(Document Object Model)和XPath都是XML处理的重要工具。DOM是一种标准的W3C推荐模型,用于解析和表示XML文档的结构,而XPath则是一种在XML文档中查找信息的语言。在这个场景中,"dom+xpath的jar...

    dom4j基础入门文档(SAX,DOM,XPATH)

    相较于W3C DOM API,dom4j的优势在于它内置了本地XPath支持,使得XML文档的查询和操作更为简便。本文将深入介绍dom4j的基础概念和常用方法。 一、dom4j主要接口 1. `org.dom4j.Attribute`: 表示XML文件的属性,...

    dom4j及xpath基础应用

    **DOM4J与XPath基础应用** DOM4J和XPath是Java开发中处理XML文档的两个重要工具。在本文中,我们将深入探讨它们的基本概念、功能以及如何在实际项目中运用。 **DOM4J简介** DOM4J是一个非常灵活且功能强大的Java ...

    xml解析笔记(dom,xpath,xquery等)

    这篇笔记将围绕XML的解析方法,重点讨论DOM、XPath和XQuery这三种解析技术。 **DOM(Document Object Model)解析:** DOM是W3C推荐的一种XML文档的API,它将XML文档视为一个树形结构,每个节点代表XML文档的一个...

    xml+dom4j+xpath资料

    结合DOM4J和XPath,我们可以高效地处理XML文档。首先,使用DOM4J的解析器读取XML文件,创建Document对象;然后,利用XPath的API,如`org.dom4j.XPath`,编译并执行XPath表达式,获取到所需节点列表;最后,对这些...

    php+xml编程之xpath的应用实例

    PHP 文件在载入xml文件和创建DOMDocument 对象后,就可以开始建立DOMXPath 对象。建立形式如下: 复制代码 代码如下:$xpath = new DOMXPath($xmldoc); 建立 DOMXPath 对象后,就可以开始使用 DOMXPath::query()方法...

    DOM4J_xpath

    ### DOM4J与XPath详解 #### 一、DOM4J简介 **DOM4J**是一款由dom4j.org开发的开源XML解析库,专为Java平台设计,它不仅支持DOM和SAX这...对于想要学习DOM4J和XPath的朋友来说,本文提供了深入的理解和技术实践指南。

    DOM操作XML,XPATH技术

    AJAX即Asynchronous JavaScript and XML,是一种创建交互式网页应用的技术,DOM和XPath在这里是处理后台XML数据的重要工具。 **DOM操作XML** DOM允许开发人员将XML文档解析为一系列可操作的对象,这些对象称为节点...

    dom4j及xpath jar包

    要使用DOM4J和XPath,首先需要在项目中引入相应的jar包。提供的压缩包中包含的"dom4j"文件,很可能就是DOM4J库的jar包。通常,还需要一个支持XPath的jar包,如jaxen,它为DOM4J提供了XPath的支持。如果你的描述中...

    mysql和Xpath和Dom4J 的jar包

    结合XPath,Dom4J可以实现对XML文档的精确定位和高效处理。 综上所述,`mysql-connector-java.jar`是用于Java连接MySQL数据库的库,XPath是用于选取XML节点的语言,而Dom4J是用于处理XML文档的Java库。这三个组件在...

    dom4j用到的xpath\dom4j等一系列jar包

    下面是一个简单的示例,展示如何使用DOM4J和XPath: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.XPath; // 创建XML文档 String xml = ...

    dom4j中xpath的使用

    这篇文档将深入探讨DOM4J如何结合XPath进行操作,帮助你理解和运用这一强大的工具。 ### XPath基础 XPath的语法基于路径表达式,它允许我们通过节点路径来定位XML文档中的元素。路径表达式可以是相对的或绝对的,...

    SelectDomXpathandCsspath:选择所有的 Dom Xpath 和 Css 路径

    2. **性能**:DOM API通常比XPath和CSS路径更快,因为它直接操作内存中的DOM树。XPath的性能因实现而异,某些情况下可能较慢。CSS路径在大多数现代浏览器中表现良好,但在老版本或不支持高级选择器的浏览器中可能会...

    dom4j中XPath用法

    要使用DOM4J的XPath功能,首先需要引入DOM4J库和JAXP(Java API for XML Processing),后者提供了XPath的实现。在Java项目中,这通常通过添加对应的依赖完成。例如,在Maven项目中,可以在pom.xml文件中加入以下...

Global site tag (gtag.js) - Google Analytics