我正在开发一个新的类来包装XML处理。我希望我的类在安装时使用simplexml,如果不安装则使用内置的XML函数。谁能给我一些关于骨架类的建议呢?使用一堆if语句乱丢每个方法似乎“错误”,而且看起来似乎也几乎无法正确测试。
任何前期建议都会很棒!
编辑:我在谈论these built-in xml functions。
答案 0 :(得分:1)
您指的是哪些内置xml函数? SimpleXml是一个标准扩展,它使用下面的libxml - 就像dom扩展一样。因此,如果安装了dom扩展,那么SimpleXml可能也是如此。
答案 1 :(得分:1)
我已经创建了一个包含SimpleXml功能的类......从中获取可能的内容......
有一个奇怪的事情......就是SimpleXml不允许它的构造函数被重载,所以你不能在启动时做事...就像覆盖输入值(即所以你可以接受XML,如同输入)。我通过使用ArrayObject类来包装新的SimpleXml类来解决这个限制。
答案 2 :(得分:0)
我使用这样的东西来做xml翻译和内容:
假设xml结构是这样的(使用常规结构很重要,意味着你可以实现一些很好的敏捷技巧!):
<word name="nameofitem">
<en>value</en>
<pt>valor</pt>
<de>value_de</de>
</word>
然后是一个处理xml的类:
class translations
{
public $xml = null;
private $file = null;
private $dom = null;
function __construct($file="translations") {
// get xml
$this->file = $file;
$this->haschanges = false;
$this->xml = file_get_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$file.".xml");
$this->dom = new DOMdocument();
$this->dom->loadXML($this->xml);
}
function updateNode($toupdate, $newvalue, $lang="pt",$rootnode="word"){
$this->haschanges = true;
$nodes = $this->dom->getElementsByTagName($rootnode);
foreach ($nodes as $key => $value) {
if ($value->getAttribute("name")==$toupdate) {
$nodes->item($key)->getElementsByTagName($lang)->item(0)->nodeValue = htmlspecialchars($newvalue,ENT_QUOTES,'UTF-8');
}
}
}
function saveUpdated(){
$toSave = $this->dom->saveXML();
if ($this->haschanges === true) {
file_put_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$this->file.".xml", $toSave);
return true;
}
else {
return false;
}
}
}
为了简洁起见,我拿出了一些方法,但是我也将这些方法用于处理文件和图像上传等。
完成所有这些后,您就可以:
$xml = new translations();
// loop through all the language posts
foreach ($_POST["xml"]["en"] as $key => $value) {
$xml->updateNode($key, stripslashes($value), "en");
}
或某事;)希望这会给你一些想法!