【问题标题】:Is there a way to tell SimpleXMLElement to put the new child on a new line?有没有办法告诉 SimpleXMLElement 把新的孩子放在一个新的行上?
【发布时间】:2020-03-11 22:53:03
【问题描述】:

有没有办法告诉 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>

我正在使用我创建的一个看起来像这样的函数在文件末尾添加一行:

    $xmlstr=file_get_contents('my_filename.xml');
    $address=get_address_string($event['eventtag'],'eventtag','events');
    echo($xmlstr);
    $sxe = new SimpleXMLElement($xmlstr);
    $marker = $sxe->addChild('marker');
    $marker->addAttribute('id', $event['eventid']);
    $marker->addAttribute('name', $event['eventname']);
    $marker->addAttribute('address', $address);
    $marker->addAttribute('lat', $event['latitude_dd']);
    $marker->addAttribute('lng', $event['longitude_dd']);
    $marker->addAttribute('type', 'event');
    echo $sxe->asXML('my_filename.xml');
}

问题是它添加了新元素而没有任何换行:

<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

【问题讨论】:

  • 不,似乎没有办法做到这一点。标签之间的空格在 XML 中是无关紧要的,SimpleXML 没有任何方法可以自定义格式。
  • 更复杂的DOMDocument也没有。
  • @Barmar 取决于格式。空格可以有意义。以 XHTML 中的pre 为例。

标签: php xml simplexml


【解决方案1】:

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

如果您了解任何事物都是节点,那么使用 DOM 是可能的。不仅是元素,还有属性和文本。

markers 的最后一个子节点不是marker 元素,而是一个 后面有空格的文本节点。

这是一个小演示:

$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

正如您在输出中看到的那样,marker 元素节点被带有单个字符(换行符)的文本节点包围。

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

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

输出:

<?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 支持自动格式化。如果使用它将在序列化过程中添加空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    相关资源
    最近更新 更多