Php 有没有办法告诉SimpleXMLElement将新的孩子放到新的行上?

Php 有没有办法告诉SimpleXMLElement将新的孩子放到新的行上?,php,xml,simplexml,Php,Xml,Simplexml,有没有办法告诉SimpleXMLElement将新的孩子放到新的行上 我将在现有XML文件的末尾追加一行。该文件如下所示: <markers> <marker id="2" name="Diane Gold, CORPORATE TAI CHI means do it in a group." address="Boca Raton, FL 33432, USA" lat="26.340200" lng="-80.081400" type="school"/> <m

有没有办法告诉SimpleXMLElement将新的孩子放到新的行上

我将在现有XML文件的末尾追加一行。该文件如下所示:

<markers>
<marker id="2" name="Diane Gold, CORPORATE TAI CHI means do it in a group." address="Boca Raton, FL 33432, USA" lat="26.340200" lng="-80.081400" type="school"/>
<marker id="3" name="Tai Chi - Stress Management and Relaxation Technology" address="10100 Roe Ave, Overland Park, KS 66207, USA" lat="38.945300" lng="-94.639400" type="school"/>
<marker id="4" name="Wise Orchid Taijiquan and QiGong" address="2002 E Union St, Seattle, WA 98122, USA" lat="47.613200" lng="-122.306000" type="school"/>
</marker>
问题是它添加新元素时没有任何换行符:

<marker id="" name="Newest Event for Testing" address="1 Arrowhead Drive, , Douglassville, PA, 19518  USA" lat="" lng="" type="event"/><marker id="" name="Newest Event for Testing" address="1 Arrowhead Drive, , Douglassville, PA, 19518  USA" lat="" lng="" type="event"/><marker id="" name="Kutztown University World Tai Chi Day 2020" address="1 Arrowhead Drive, , Douglassville, PA, 19518  USA" lat="" lng="" type="event"/><marker id="1299" name="A Newer WTCD test event" address="1 Arrowhead Drive, , Douglassville, PA, 19518  USA" lat="" lng="" type="event"/><marker id="1302" name="Newest Event for Testin2" address="1 Arrowhead Drive, , Douglassville, PA, 19518  USA" lat="" lng="" type="event"/></markers>

我尝试了几十种不同的方法,我阅读了stackoverflow上关于新行主题的所有内容。大多数处理文件读入后的格式设置,或者使用DOM或SimpleXMLElement以外的其他东西写入xml。我只是在学习这些东西,我已经用尽了我的知识,如何在那里换行。有人知道我还能尝试什么吗

谢谢
CJ

SimpleXML不允许控制格式设置。它与基本XML数据无关

如果您知道任何东西都是一个节点,那么使用DOM是可能的。不仅仅是元素,还有属性和文本

标记
的最后一个子节点不是
标记
元素,而是 文本节点,后跟空格

下面是一个小演示:

$document = new DOMDocument();
$document->loadXML($xml);
$markers = $document->documentElement;
foreach ($markers->childNodes as $childNode) {
    echo $childNode->nodeName, ': ', strlen($childNode->textContent), "\n";
}
输出:

#text: 1
marker: 0
#text: 1
marker: 0
#text: 1
marker: 0
#text: 1
<?xml version="1.0"?>
<markers>
<marker id="2" name="Diane Gold, CORPORATE TAI CHI means do it in a group." address="Boca Raton, FL 33432, USA" lat="26.340200" lng="-80.081400" type="school"/>
<marker id="3" name="Tai Chi - Stress Management and Relaxation Technology" address="10100 Roe Ave, Overland Park, KS 66207, USA" lat="38.945300" lng="-94.639400" type="school"/>
<marker id="4" name="Wise Orchid Taijiquan and QiGong" address="2002 E Union St, Seattle, WA 98122, USA" lat="47.613200" lng="-122.306000" type="school"/>
<marker id="42" name="A Title"/>
</markers>
正如您在输出中所看到的那样,
标记
元素节点被带有单个字符(换行符)的文本节点包围

格式是带有空白字符的文本节点。您可以根据需要创建和附加/插入它们

$document = new DOMDocument();
$document->loadXML($xml);
$markers = $document->documentElement;

$marker = $markers->appendChild($document->createElement('marker'));
$marker->setAttribute('id', '42');
$marker->setAttribute('name', 'A Title');
// add the line break as a text node
$markers->appendChild($document->createTextNode("\n"));

echo $document->saveXML();
输出:

#text: 1
marker: 0
#text: 1
marker: 0
#text: 1
marker: 0
#text: 1
<?xml version="1.0"?>
<markers>
<marker id="2" name="Diane Gold, CORPORATE TAI CHI means do it in a group." address="Boca Raton, FL 33432, USA" lat="26.340200" lng="-80.081400" type="school"/>
<marker id="3" name="Tai Chi - Stress Management and Relaxation Technology" address="10100 Roe Ave, Overland Park, KS 66207, USA" lat="38.945300" lng="-94.639400" type="school"/>
<marker id="4" name="Wise Orchid Taijiquan and QiGong" address="2002 E Union St, Seattle, WA 98122, USA" lat="47.613200" lng="-122.306000" type="school"/>
<marker id="42" name="A Title"/>
</markers>


此外,DOM还支持自动格式化。如果使用,它将在序列化过程中添加空格。

不,似乎没有办法做到这一点。标记之间的空白在XML中是不相关的,
SimpleXML
无法自定义格式。更复杂的
DOMDocument
@Barmar也无法自定义格式。空格可以有意义。以XHTML中的
pre
为例。