Есть ли способ сказать SimpleXMLElement перевести нового дочернего элемента в новую строку? - PullRequest
1 голос
/ 12 марта 2020

Есть ли способ сказать 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>

Я перепробовал десятки разных вещей, и я прочитал все о стека overflow, что я мог найти в topi c нового линий. Большинство имеет дело с форматированием файла после того, как он был прочитан, или использует DOM или что-то отличное от SimpleXMLElement для записи в xml. Я только изучаю этот материал и исчерпал свои знания о том, как сделать разрыв строки там. Кто-нибудь знает, что еще я могу попробовать?

Спасибо, CJ

1 Ответ

2 голосов
/ 12 марта 2020

Простой XML не позволяет контролировать форматирование. Это не относится к базовым c 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 поддерживает автоматическое форматирование c. Если он используется, он добавит пробелы во время сериализации.

...