使用 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 标签没有用&lt;/content&gt; 关闭? @Shackrock: 关闭了,看的">"前面的"/" 如何在内容标签之间添加一些文本。说 哇,它的工作原理! 【参考方案3】:

请看我的回答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)

如何使用合法的 XML 将数组转换为 SimpleXML [重复]

使用 BeautifulSoup 创建 XML 文档

使用simplexml处理xml文件的Tips

使用 SimpleXML 读取 XML

使用 php 创建一个临时 xml 文件