科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件DOMXML: Expat之外的另一选择

DOMXML: Expat之外的另一选择

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在网上有许多php的XML教程,但是只有少数介绍如何使用DOM来解析XML。

作者:施文建编译 来源:yesky 2007年10月26日

关键字: Linux

  • 评论
  • 分享微博
  • 分享邮件
使用对象

  DOM模型只有三个函数,XMLdoc(),XMLdocfile()和XMLtree()。剩下的时间,我们将用这些对象进行处理。上面的函数都返回DomDocument对象。这有一些例子,关于如何装载XML数据到你的php脚本。

<?php

 # 使用下面两个方法中的任一个,从一个字符串装载XML

 $doc = XMLdoc( $XMLstr );
 $tree = XMLtree( $XMLstr );

 # 从一个文件装载XML
 $doc = XMLdocfile( $XMLfile );

?>

  如果XML不能被正确解析,那么这些函数都会掷出一个错误。DOM不会为你验证XML文件的正确性。你必需用其他的方式来完成这一点。或许可以通过其他的程序来做,如XMLlint。译注:微软IE中内嵌XML解析器,只要用IE来浏览XML文档,就可以验证文档的有效性了。

  一个简单的例子

  让我们用一个简单的例子,将前面提到的东西联系起来。
<?php

 # 生成一个XML范例文档,以进行演示
 $XMLstr = "<" . "?" . "XML version=\"1.0\"" . "?" . ">";
 $XMLstr .=
 "
  <employee>
   <name>Matt</name>
   <position type=\"contract\">Web Guy</position>
  </employee>
 ";

 # 装载XML数据($doc成为一个DomDocument对象的实例)
 $doc = XMLdoc($XMLstr);

 # 得到根节点"employee"
 $employee = $doc->root();

 # 得到employee节点的子节点("name","position")
 $nodes = $employee->children();
 
 # 我们打算使用"position"节点
 # 因此我们必需反复通过employee的子节点来搜索它
 while ($node = array_shift($nodes))
 {
  if ($node->name == "position")
  {
   $position = $node;
   break;
  }
 }

 # 得到position的类型属性
 $type = $position->getattr("type");
 
 # 得到被封闭在position标记中的文本
 # 移动到position子节点的第一个子节点
 # 译注:这里的用法可以参考第一部分“DOM如何构造XML”的最后一段。
 $text_node = array_shift($position->children());

 # 访问这个文本节点的内容属性
 $text = $text_node->content;

 # 输出position和type
 echo "position: $text<BR>";
 echo "type: $type";

?>

  这个例子将产生下面的输出。

position: Web Guy
type: contract

  上面例子中,while循环实际上是寻找position节点。这里的employee节点真正有5个子节点:三个text(文本),一个name,一个position。这个文本节点包含在行末尾的换行。这一点开始看起来比较奇怪,但是DOM将任何的字符串(即使是那些只包含空白部分的)都作为text(文本),并为它们都创造一个节点。
如果你为了确保employee节点只有两个子节点,那么你必需象这样写XML项目。

<employee>
 <name>Matt</name>
 <position type="contract">Web Guy</position>
</employee>

  一个更长的例子

  下面是一个更长的例子,关于如何从一个XML文档中提取信息。比如,我们有一个employees.XML文件,它包含employee信息。

<?XML version="1.0"?>

 <employees company="zoomedia.com">
 <employee>
  <name>Matt</name>
  <position type="contract">Web Guy</position>
 </employee>

 <employee>
  <name>George</name>
  <position type="full time">Mad Hacker</position>
 </employee>

 <employee>
  <name>Wookie</name>
  <position type="part time">Hairy SysAdmin</position>
 </employee>
</employees>

  下面展示如何在php脚本提取这个信息。

<?php

 # 遍历一个节点数组,寻找一个文本节点,并返回它的内容
 function get_content($parent)
 {
  $nodes = $parent->children();
  while($node = array_shift($nodes))
  if ($node->type == XML_TEXT_NODE)
   return $node->content;
  return "";
 }

 # 得到一个特定节点的内容
 function find_content($parent,$name)
 {
  $nodes = $parent->children();
  while($node = array_shift($nodes))
   if ($node->name == $name)
    return get_content($node);
   return "";
 }

 # 得到一个特定节点的属性
 function find_attr($parent,$name,$attr)
 {
  $nodes = $parent->children();
  while($node = array_shift($nodes))
   if ($node->name == $name)
     return $node->getattr($attr);
  return "";
 }

 # 载入XML文档
 $doc = XMLdocfile("employees.XML") or die("What employees?");

 # 得到根节点(employees)
 $root = $doc->root();

 # 得到employees的子节点数组,它包含了每一个employee节点
 $employees = $root->children();

 # 在数组中移动,输出一些emloyee数据
 while($employee = array_shift($employees))
 {
  if ($employee->type == XML_TEXT_NODE)
   continue;

   $name = find_content($employee,"name");
   $pos = find_content($employee,"position");
   $type = find_attr($employee,"position","type");

   echo "$name the $pos, $type employee<br>";
 }

?>

  你可以从你的浏览器上看到下面的输出。

Matt the Web Guy, contract employee
George the Mad Hacker, full time employee
Wookie the Hairy SysAdmin, part time employee

  另一个例子(增加数据)

  因为XML被载入到内存作为一个树,所以我们能够很容易地操作这些数据。必要时,我们能够增加分支或节点。

  比方说,我们想在XML文件中增加一个employee(售员)。

<?php

# 生成子节点的函数
function make_node($parent,$name,$content)
{
# 增加一个新子节点到父节点
$parent->new_child($name,$content);

# 返回新增加的子节点
return $parent->lastchild();
}

# 载入XML文件,得到根节点
$doc = XMLdocfile("employees.XML") or die("Do you even have any employees?");
$root = $doc->root();

# 赋予新employee(雇员)一个名字
$newguy = make_node($root,"employee","");

# 增加新成员的名字
make_node($newguy,"name","New Guy");

# 增加他的职位
$position = make_node($newguy,"position","Backup Gnome");

# 设置'type'属性
$position->setattr("type","intern");

# 将我们改变过的XML文档输出到浏览器
echo $doc->dumpmem();

?>

  这个脚本将会打印XML文档到浏览器上,所以你可能愿意使用'查看源文件'来看这些数据。

  结论

  这些差不多就是DOMXML的全部了。它是一个简单的方法,在脚本中解析并操作XML。希望这篇文章能吸引更多的人关注PHP中的这个角落。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章