php使用 DOM 创建xml文档

 

创建文件信息元素
function save_document_info($fileInfo){
   $doc = new DOMDocument('1.0');
   $root = $doc->createElement('workflow');
   $doc->appendChild($root);
   $statistics = $doc->createElement("statistics");
   $statistics->setAttribute("total", "1");
   $statistics->setAttribute("approved", "0");
   $root->appendChild($statistics);

  
$filename = $fileInfo['name'];
   $filetype = $fileInfo['type'];
   $filesize = $fileInfo['size'];

   $fileInfo = $doc->createElement("fileInfo");

   $fileInfo->setAttribute("status", "pending");
   $fileInfo->setAttribute("submittedBy", $_SESSION["username"]);

   $approvedBy = $doc->createElement("approvedBy");

   $fileName = $doc->createElement("fileName");
   $fileNameText = $doc->createTextNode($filename);
   $fileName->appendChild($fileNameText);

   $location = $doc->createElement("location");
   $locationText = $doc->createTextNode(UPLOADEDFILES);
   $location->appendChild($locationText);

   $type = $doc->createElement("fileType");
   $typeText = $doc->createTextNode($filetype);
   $type->appendChild($typeText);

   $size = $doc->createElement("size");
   $sizeText = $doc->createTextNode($filesize);
   $size->appendChild($sizeText);

   $fileInfo->appendChild($approvedBy);
   $fileInfo->appendChild($fileName);
   $fileInfo->appendChild($location);
   $fileInfo->appendChild($type);
   $fileInfo->appendChild($size);

   $root->appendChild($fileInfo);

   $doc->save(UPLOADEDFILES."docinfo.xml");

}
...
这里代码虽然很长,但没有多少新东西。首先从传递给函数的信息中提取实际的文件信息。然后创建 fileInfo 元素,让其包含要添加的所有信息。设置该元素的 status submittedBy 属性,然后再创建该元素的孩子。 approvedBy 元素很简单。因为还没有批准,因此是个空元素。另一方面, fileName 元素稍微复杂一点,
因为需要添加文本孩子。幸运的是,这一点也很简单。创建一个元素,然后使用 Document 创建新的文本节点,该节点的内容是文件名,再将该文本节点添加为 fileName 元素的孩子即可。
依此类推,创建最终作为 fileInfo 孩子的所有元素。创建完成后,将其作为孩子添加到 fileInfo 元素中。最后将 fileInfo 元素自身添加为根元素 workflow 的孩子。
为了清晰起见,添加空格后的结果如下所示:
<?xml version="1.0"?>
<workflow>
   <statistics total="1" approved="0"/>
   <fileInfo status="pending" submittedBy="roadnick">
      <approvedBy/>
      <fileName>signed.pem</fileName>
      <location>/var/www/hidden/</location>
      <fileType>application/octet-stream</fileType>
      <size>2754</size>
   </fileInfo>
</workflow>
加载已有的文档                                                                                                                                     
现在已经了解了如何向文件中添加信息,还需要看看如何在后续上传中使用该文件。首先需要检查文件是否存在,然后执行相应的动作:
...
function save_document_info($fileInfo){
  $xmlfile = UPLOADEDFILES."docinfo.xml";
   if(is_file($xmlfile)){
      $doc = DOMDocument::load($xmlfile);
      $workflowElements = $doc->getElementsByTagName("workflow");
      $root = $workflowElements->item(0);
   } else{
 
      $doc = new DOMDocument('1.0');
      $root = $doc->createElement('workflow');
      $doc->appendChild($root);
 
      $statistics = $doc->createElement("statistics");
      $statistics->setAttribute("total", "1");
      $statistics->setAttribute("approved", "0");
      $root->appendChild($statistics);
   }
 
   $filename = $fileInfo['name'];
   $filetype = $fileInfo['type'];
   $filesize = $fileInfo['size'];
 
   $fileInfo = $doc->createElement("fileInfo");
...
   $fileInfo->appendChild($size);
 
   $root->appendChild($fileInfo);
 
   $doc->save($xmlfile);
 
}
 
一开始创建了一个变量表示文件的位置,现在可以从多个地方引用它。
然后检查文件是否已经存在。如果有的话调用 load() 函数而不是创建新的对象。这个静态函数(将在本系列教程第 3 部分中详细讨论,现在只要知道它是可以从类而不是对象调用的函数)返回 Document 对象,这个对象已经填充了文件中表示的所有元素、文本等等。
有了 Document 对象之后,还需要 workflow 元素,因为最终要把新的 fileInfo 元素添加给它。要得到 workflow 元素,首先在称为 workflow 的文档中检索到所有元素的列表,然后从列表中选择第一个元素。此后只要添加新的 fileInfo 元素就可以了,新元素出现在原有元素的后面。
下面是增加了空格后的清单:
<?xml version="1.0"?>
<workflow>
   <statistics total="1" approved="0"/>
   <fileInfo status="pending" submittedBy="roadnick">
      ...
   </fileInfo>
  <fileInfo status="pending" submittedBy="roadnick">
      <approvedBy/>
      <fileName>timeone.jpg</fileName>
      <location>/var/www/hidden/</location>
      <fileType>image/jpeg</fileType>
      <size>2020</size>
   </fileInfo>
</workflow>
但是 statistics 怎么办呢?显然,统计数据不再正确了,必须加以修改。
操纵已有的数据                                                                                                                                     
除了向文档添加信息之外,还可以修改已经存在的信息。
比如,可以修改 statistics 元素的 total 属性:
...
   if(is_file($xmlfile)){
      $doc = DOMDocument::load($xmlfile);
      $workflowElements = $doc->getElementsByTagName("workflow");
      $root = $workflowElements->item(0);
 
      $statistics = $root->getElementsByTagName("statistics")->item(0);
      $total = $statistics->getAttribute("total");
      $statistics->setAttribute("total", $total + 1);
 
   } else{
...
首先,按照与 workflow 元素同样的方式得到对已有 statistics 元素的引用,只不过两步可以合为一步。得到元素的引用后,可以使用 getAttribute() 函数得到 total 属性的当前值。然后使用这个值通过 setAttribute() 修改 total 属性的值。
结果和您期望的一样,这一次没有添加空格:
<?xml version="1.0"?>
<workflow><statistics total="2" approved="0"/><fileInfo status="pending"
submittedBy="roadnick">...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值