创建文件信息元素
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");
}
...
$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">...