使用 SimpleXML 从头开始创建 XML 对象
Posted
技术标签:
【中文标题】使用 SimpleXML 从头开始创建 XML 对象【英文标题】:Using SimpleXML to create an XML object from scratch 【发布时间】:2010-09-13 16:12:10 【问题描述】:是否可以使用 php 的 SimpleXML 函数从头开始创建 XML 对象?查看函数列表,有一些方法可以将现有的 XML 字符串导入到对象中,然后您可以对其进行操作,但如果我只想从头开始以编程方式生成 XML 对象,那么最好的方法是什么?
我发现你可以使用 simplexml_load_string() 并传入你想要的根字符串,然后你就有了一个可以通过添加孩子来操作的对象......虽然这看起来有点像黑客,因为在加载之前,我必须将一些 XML 硬编码到字符串中。
我已经使用DOMDocument functions 完成了它,虽然它有点令人困惑,因为我不确定 DOM 与创建纯 XML 文档有什么关系......所以也许它只是名字不好:-)
【问题讨论】:
【参考方案1】:在 PHP5 中,您应该改用 Document Object Model 类。 示例:
$domDoc = new DOMDocument;
$rootElt = $domDoc->createElement('root');
$rootNode = $domDoc->appendChild($rootElt);
$subElt = $domDoc->createElement('foo');
$attr = $domDoc->createAttribute('ah');
$attrVal = $domDoc->createTextNode('OK');
$attr->appendChild($attrVal);
$subElt->appendChild($attr);
$subNode = $rootNode->appendChild($subElt);
$textNode = $domDoc->createTextNode('Wow, it works!');
$subNode->appendChild($textNode);
echo htmlentities($domDoc->saveXML());
【讨论】:
DOM API 太冗长了!我希望能够做类似$elem->append($doc->p('This is a paragraph'));
之类的事情,即使附加文本也是两行苦差事。我喜欢$elem->append('Some text');
在我看来,这很大程度上取决于您打算做什么。如果您想要基本和快速的功能,SimpleXML 是完美的!但无论如何:问题是“使用 SimpleXML 从头开始创建 XML 对象”——太离题了,抱歉。【参考方案2】:
当然可以。例如。
<?php
$newsXML = new SimpleXMLElement("<news></news>");
$newsXML->addAttribute('newsPagePrefix', 'value goes here');
$newsIntro = $newsXML->addChild('content');
$newsIntro->addAttribute('type', 'latest');
Header('Content-type: text/xml');
echo $newsXML->asXML();
?>
输出
<?xml version="1.0"?>
<news newsPagePrefix="value goes here">
<content type="latest"/>
</news>
玩得开心。
【讨论】:
在这与@Stefan 和@PhiLho 的答案之间,这似乎是最简单直接的。同时,我想知道性能是否不同。另外两个闻起来像快速代码。 如何将其保存为服务器中的 xml 文件?使其可用于我的动作脚本代码? @dreamwerx 也许我遗漏了什么,为什么你的content
标签没有用</content>
关闭?
@Shackrock: 关闭了,看请看我的回答here。正如dreamwerx.myopenid.com 指出的那样,使用SimpleXML 可以做到这一点,但DOM extension 会是更好、更灵活的方式。另外还有第三种方式:使用XMLWriter。它比 DOM 更易于使用,因此它是我从头开始编写 XML 文档的首选方式。
$w=new XMLWriter();
$w->openMemory();
$w->startDocument('1.0','UTF-8');
$w->startElement("root");
$w->writeAttribute("ah", "OK");
$w->text('Wow, it works!');
$w->endElement();
echo htmlentities($w->outputMemory(true));
顺便说一句:DOM代表Document Object Model;这是 XML 文档的标准化 API。
【讨论】:
如果您打算直接输出到 XML 代码而不进行任何操作,那么 XMLwriter 是很好的选择。进一步的操作(移动元素,插入元素)是不可能的。 更新链接(我认为)php.net/manual/en/intro.xmlwriter.php, php.net/manual/en/book.dom.php以上是关于使用 SimpleXML 从头开始创建 XML 对象的主要内容,如果未能解决你的问题,请参考以下文章
Java - 将xml转换为JAVA Pojo类,包括java注释(Simplexml)