用户名: 密码: 验证码:           网站地图 高级搜索 RSS订阅 收藏本站
Google
您的位置:首页>>网络编程>>XML编程>>阅读资讯:PHP中的XML拉模式解析

PHP中的XML拉模式解析

[ 来源: | 阅读:次 | 更新日期:2007-10-10 23:05:47 | 评论 0 条 | 我要投稿 ]

  清单 9. XML-RPC 请求 www.yueluo.net

  月落

<element name="methodCall" xmlns="http://relaxng.org/ns/structure/1.0" 
 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <element name="methodName">
    <value>sqrt</value>
  </element>
  <element name="params">
    <element name="param">
      <element name="value">
        <element name="double">
          <data type="double"/>
        </element>
      </element>
    </element>
  </element>
</element> 月落 

 

月落网

  可以使用 setRelaxNGSchemaSource() 将模式作为一串文字直接嵌入 PHP 脚本,或者使用 setRelaxNGSchema() 从外部文件或 URL 读取模式。例如,假定清单 9 位于 sqrt.rng 文件中,下面将展示如何载入模式:

字串6

  

字串6

reader->setRelaxNGSchema("sqrt.rng")

  字串5

  在开始解析文档 之前,执行上述操作。解析器在进行读取时将检查文档的模式。若要检查文档是否有效,则调用 isValid(),如果文档是有效的(目前为止),则返回 true,否则,返回 false。清单 10 展示了完整的程序,包括所有错误处理。这样将接受任何合法输入,然后返回正确的值,而且将拒绝所有不正确的请求。我还添加了 fault() 方法,当发生故障时将发送 XML-RPC 错误响应。 字串6

  清单 10. 完整的 XML-RPC 平方根服务器 字串9

   字串7

header('Content-type: application/xml');
  // try grammar
  $schema = "
  xmlns='http://relaxng.org/ns/structure/1.0'
  datatypeLibrary='http://www.w3.org/2001/XMLSchema-datatypes'>
  sqrt
  ";
  if (!isset($HTTP_RAW_POST_DATA)) {
  fault(22, "Please make sure always_populate_raw_post_data = On in php.ini");
  }
  else {
  // set up the request
  $request = $HTTP_RAW_POST_DATA;
  error_reporting(E_ERROR | E_WARNING | E_PARSE);
  // create the reader
  $reader = new XMLReader();
  $reader->setRelaxNGSchema("request.rng");
  $reader->XML($request);
  $input = "";
  while ($reader->read()) {
  if ($reader->name == "double" && $reader->nodeType == XMLReader::ELEMENT) {
www.yueluo.net

  while ($reader->read()) {
  if ($reader->nodeType == XMLReader::TEXT
  || $reader->nodeType == XMLReader::CDATA
  || $reader->nodeType == XMLReader::WHITESPACE
  || $reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE) {
  $input .= $reader->value;
  }
  else if ($reader->nodeType == XMLReader::END_ELEMENT
  && $reader->name == "double") {
  break;
  }
  }
  break;
  }
  }
  if (isset($php_errormsg) ) fault(21, $php_errormsg);
  else if (! $reader->isValid()) fault(19, "Invalid request");
  else if ($input < 0) fault(20, "Cannot take square root of negative number");
字串5

  else respond($input);
  $reader->close();
  }
  function respond($input)
  {
  ?>
  echo sqrt($input);
  ?>
  }
  function fault($code, $message)
  {
  echo "
  faultCode
  " . $code . "
  faultString
  " . $message . "
  ";
  }
  

  属性 字串8

  在正常的推解析期间不会看到属性。若要读取属性,请停止在元素的起点处,通过名称或编号来请求特定属性。 字串5

  将需要的属性名称传递到 getAttribute(),以便在当前元素上查找该属性的值。例如,下面的语句请求当前元素的 id 属性: 字串9

   月落网

$id = $reader->getAttribute("id");

  字串9

  如果属性位于名称空间中 —— 例如,xlink:href —— 则调用 getAttributeNS(),将本地名称和名称空间 URI 分别作为第一个和第二个参数进行传递。(前缀是无关紧要的。)例如,下面的语句将请求 http://www.w3.org/1999/xlink/ 名称空间中 xlink:href 属性的值: www.yueluo.net

  字串8

$href = $reader->getAttributeNS("href", http://www.w3.org/1999/xlink/);

 

字串5

  如果属性不存在,那么这两种方法都将返回空字符串。(这是不正确的。它们应该返回 null。当前设计很难区分值为空字符串的属性和值根本不存在的属性。)

yueluo.net

  属性次序 字串9

  在 XML 文档中,属性次序并不重要,并且不受解析器的保护。这里用于属性索引的编号仅仅是为了方便起见。不能保证开始标记中的第一个属性就是属性 1,第二个就是属性 2 等等。不要编写依赖于属性次序的代码。 yueluo.net

  如果仅希望了解元素上的所有属性,并且事先并不知道属性名,那么当读取器位于元素上时,调用 moveToNextAttribute()。一旦解析器位于属性节点上,就可以读取属性的名称、名称空间以及元素所使用的相同属性的值。例如,以下代码片段将打印当前元素的所有属性: 

字串9

 

字串5

if ($reader->hasAttributes and $reader->nodeType == XMLReader::ELEMENT) {
  while ($reader->moveToNextAttribute()) {
  echo $reader->name . "='" . $reader->value . "'\n";
  }
  echo "\n";
  }

 

字串7

  对于 XML API 来说非常难得的是,XMLReader 允许从元素的起点 或终点 读取属性。为了避免重复计算,确认代码类型是 XMLReader::ELEMENT 而不是 XMLReader::END_ELEMENT 是很重要的,后者也可能拥有属性。 月落网

  结束语
 
  XMLReader 是添加到 PHP 程序员工具箱中的一个很有用的工具。与 SimpleXML 不同,它是处理所有文档(而不是部分文档)的完整 XML 解析器。与 DOM 不同,它可以处理大于可用内存的文档。与 SAX 不同,它将程序置于控制之下。如果 PHP 程序需要接受 XML 输入,则 XMLReader 是很值得考虑的一个工具。
月落


共3页: 上一页 [1] [2] 3 下一页
Tags:PHP中的XML拉模式解析
责任编辑:
您的评论
用户名:新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为