使用SimpleXML从头开始创建XML对象


76

是否可以使用PHP的SimpleXML函数从头开始创建XML对象?浏览功能列表,可以通过一种方法将现有的XML字符串导入到一个对象中,然后可以对其进行操作,但是如果我只是想从头开始以编程方式生成XML对象,什么是最好的方法?

我发现您可以使用simplexml_load_string()并传入所需的根字符串,然后您就可以通过添加子代来操纵对象……尽管这看起来有点像hack,因为我必须实际上,在可以加载之前,将一些XML硬编码到字符串中。

我已经使用DOMDocument函数完成了它,尽管这有点令人困惑,因为我不确定DOM与创建纯XML文档有什么关系……所以也许它的名字很糟糕:-)

Answers:


143

你当然可以。例如。

<?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的答案之间,这似乎是最简单和直接的。同时,我想知道性能是否有所不同。其他两个闻起来像快速代码。
卡米洛·马丁

2
如何在服务器中将其另存为xml文件?使它可用于我的动作脚本代码?
shababhsiddique 2011年

@dreamwerx也许我错过了一些东西,为什么您的content标签没有关闭</content>
Shackrock

1
@Shackrock:它已关闭,请查看<content type =“ latest” />“>”>之前的“ /”
Michel

4
如何在内容标签之间添加一些文本。说<content>哇,它起作用了!</ content>
harishannam 2014年

21

在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());

1
DOM API非常冗长!我很乐意能够做类似的事情。$elem->append($doc->p('This is a paragraph')); 即使添加文本也是两行杂事。我喜欢类似的东西$elem->append('Some text');
thomasrutter

2
我认为这在很大程度上取决于您打算做什么。如果您需要基本且快速的功能,SimpleXML是完美的选择!但是无论如何:问题是“使用SimpleXML从头开始创建XML对象”-太离题了,对不起。
Stephan Weinhold

16

在这里查看我的答案。正如dreamwerx.myopenid.com所指出的那样,可以通过SimpleXML进行此操作,但是DOM扩展将是一种更好,更灵活的方法。此外,还有第三种方法:使用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代表d ocument Ø bject中号奥德尔; 这是XML文档中的标准化API。


如果您打算直接输出到XML代码而不进行任何操作,那么XMLwriter是很好的选择。进一步的操作(将元素四处移动,插入元素)实际上是不可能的。
thomasrutter '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.