Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php将空子级添加到xml_Php_Xml_Simplexml - Fatal编程技术网

使用php将空子级添加到xml

使用php将空子级添加到xml,php,xml,simplexml,Php,Xml,Simplexml,基本情况是,我正在编写一个xml文件,在那里我需要一个名为的属性,而该属性中没有值,因此显示为我想要的 代码如下所示,这是php.net中给出的基本示例 <?php include 'example.php'; $sxe = new SimpleXMLElement($xmlstr); $sxe->addAttribute('type', 'documentary'); $movie = $sxe->addChild('movie'); $movie->addChi

基本情况是,我正在编写一个xml文件,在那里我需要一个名为的属性,而该属性中没有值,因此显示为我想要的

代码如下所示,这是php.net中给出的基本示例

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character  = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

$movie->addChild('test');

echo $sxe->asXML();

?>

其结果是

        <?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
<movie><title>PHP2: More Parser Stories</title><plot>This is all about the people who make it work.</plot><characters><character><name>Mr. Parser</name><actor>John Doe</actor></character></characters><rating type="stars">5</rating><test/></movie></movies>

PHP:解析器背后
科德女士


我完全被卡住了

如果确实需要像
这样的空节点,请执行以下操作:

 $child = $sxe->addChild('test');
 $child[0] = '';
现在节点为空,但显示为


如果确实需要像
这样的空节点,请执行以下操作:

 $child = $sxe->addChild('test');
 $child[0] = '';
现在节点为空,但显示为

在XML中,
是完全等效的。据我所知,处理器可以随意将一个重写为另一个

因此,在操作文档的树表示形式时,在它们之间进行选择的操作不会发生,而是在将其写入字符串时发生

当使用
->asXML()
保存XML时,SimpleXML当前不支持标志,但DOM等价物(
->save()
->saveXML()
)支持标志。幸运的是,DOM和SimpleXML使用相同的内部表示形式,因此您可以从一种表示形式转换到另一种表示形式,而不会降低性能

您想要的标志列在:

LIBXML_NOEMPTYTAG 展开空标记(例如,



要使用它,您可以写:

$dom = dom_import_simplexml($sxe);
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
尽管您可能能够诱使XML库创建一个树结构,默认情况下它会序列化为
(例如零长度文本节点),但新版本的库优化了您的技巧,这很容易被打破。如果您将XML保存为字符串并再次解析它,这种差异也将消失。

在XML中,
是完全等效的。据我所知,处理器可以随意将一个重写为另一个

因此,在操作文档的树表示形式时,在它们之间进行选择的操作不会发生,而是在将其写入字符串时发生

当使用
->asXML()
保存XML时,SimpleXML当前不支持标志,但DOM等价物(
->save()
->saveXML()
)支持标志。幸运的是,DOM和SimpleXML使用相同的内部表示形式,因此您可以从一种表示形式转换到另一种表示形式,而不会降低性能

您想要的标志列在:

LIBXML_NOEMPTYTAG 展开空标记(例如,



要使用它,您可以写:

$dom = dom_import_simplexml($sxe);
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);

尽管您可能能够诱使XML库创建一个树结构,默认情况下它会序列化为
(例如零长度文本节点),但新版本的库优化了您的技巧,这很容易被打破。如果您将XML另存为字符串并再次解析,则差异也将消失。

对于正在使用

$xml = new DOMDocument('1.0', 'utf-8');
而不是SimpleXML,@JustOnUnderMillions给了我答案 致命错误:无法将DomeElement类型的对象用作…中的数组。

我发现设置对象的“nodeValue”对我有效:

$child = $parent->appendChild($dom->createElement('test')); 
$child->nodeValue = '';

对于那些正在使用

$xml = new DOMDocument('1.0', 'utf-8');
而不是SimpleXML,@JustOnUnderMillions给了我答案 致命错误:无法将DomeElement类型的对象用作…中的数组。

我发现设置对象的“nodeValue”对我有效:

$child = $parent->appendChild($dom->createElement('test')); 
$child->nodeValue = '';

等等,有什么区别?你能指出吗?一个小得多的例子更适合这个问题。你真的只需要
作为你的起点,那么输出的差异就会明显得多。等等,有什么区别?你能指出吗?一个小得多的例子更适合这个问题。你真的只需要
作为你的出发点,然后输出的差异就会明显得多。谢谢,这确实奏效了。虽然是一个黑客,但可以按要求工作,再次感谢你,你为我节省了很多时间。哦,这很好,如果有点奇怪的话。显然,
$sxe->addChild('test','')
也同样有效,其行为与
$sxe->addChild('test')的行为不同
$sxe->addChild('test',null)@IMSoP
$sxe->addChild('test','')
它确实生成了
,对其进行了测试,并使用
$sxe->asXML()
检查了结果。也许这取决于PHP版本。但是如果您不知道它是如何工作的,
simpleXML
是有线的;-)@IMSoP,上面的创建,在问这个问题之前,我试着,只有当你在那里给一个空间,它才会在结果中创建一个空间。嗯,我想收回我的投票,因为我认为这个方法不可靠。我只是在这里测试了一些变体,上面的代码确实是唯一给出所需格式的代码;但是我在本地运行了相同的代码,
->addChild('test','')
也生成了该表单。这表明不同的设置将表现出不同的行为,有些设置可能会为上述代码生成
。我不想依赖它,因为它这样做没有一些书面的理由。谢谢,这确实奏效了。虽然是一个黑客,但可以按要求工作,再次感谢你,你为我节省了很多时间。哦,这很好,如果有点奇怪的话。显然,
$sxe->addChild('test','')
也可以工作,其行为与
$sxe->addChild('test')不同
$sxe->addChild('test',null)@IMSoP
$sxe->addChild('test','')
它确实生成了
,对其进行了测试,并使用
$sxe->asXML()
检查了结果。也许这取决于PHP版本。但是如果您不知道它是如何工作的,
simpleXML
是有线的;-)@IMSoP,上面的创建,在这里问这个问题之前,我尝试过,只有当你在那里给一个空间,它才会创建一个s