XML-форматирование - простой XML не делает красивое форматирование (форматирование отступа)

1

Я преобразовываю php-переменные в формат XML.

я заметил, что когда я просто использую DOMDocument вместе с;

$dom-> formatOutput = true;

для создания XML, он правильно форматирует (т.е. отступы строк и т.д.),

код, используя только DOMDocument

$dom = new DOMDocument('1.0','UTF-8');
    $dom->formatOutput = true;

    $root = $dom->createElement('student');
    $dom->appendChild($root);

    $result = $dom->createElement('result');
    $root->appendChild($result);

    $result->setAttribute('id', 1);
    $result->appendChild( $dom->createElement('name', 'Opal Kole') );
    $result->appendChild( $dom->createElement('sgpa', '8.1') );
    $result->appendChild( $dom->createElement('cgpa', '8.4') );

    echo '<xmp>'. $dom->saveXML() .'</xmp>';
    $dom->save('result.xml') or die('XML Create Error');

**Результат **

<?xml version="1.0" encoding="UTF-8"?>
<student>
  <result id="1">
    <name>Opal Kole</name>
    <sgpa>8.1</sgpa>
    <cgpa>8.4</cgpa>
  </result>
</student>

Однако, если я пытаюсь использовать simplexml с domDocument, он больше не форматируется правильно;

ниже - образец проблемы

$dom = new domDocument; 

$dom->formatOutput = true;   
$root = $dom->appendChild($dom->createElement( "user" ));    
$sxe = simplexml_import_dom( $dom );     
$sxe->addChild("firstname", "John");    
$sxe->addChild("surname", "Brady"); 

$sxe->asXML('testingXML.xml');

результат;

<?xml version="1.0"?>
<user><firstname>John</firstname><surname>Brady</surname></user>

вы заметите, что оно больше не форматируется нужным образом.

Я следил за всеми примерами онлайн-уроков, которые сочетают простой xml с dom, но ни один из них не отформатирован правильно.

ОБНОВИТЬ

Я попробовал много решений на форумах, но, похоже, не работал для меня.

однако, я только что нашел это solution-, он действительно work-, однако, его длинный ветер. он требует от меня сначала сохранить файл с помощью simpleXML и затем перезагрузить сохраненный файл и СЕЙЧАС сохранить его с помощью DocumentDom:

 $sxe->asXML('simple_xml_create.xml');

    $simplexml = simplexml_load_file("simple_xml_create.xml");
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simplexml->asXML());
$xml = new SimpleXMLElement($dom->saveXML());


$xml->saveXML("simple_xml_create.xml");

ЭТО БОЛЕЕ ЭЛЕГАНТНОЕ РЕШЕНИЕ?

  • 0
    Вы искали именно эту проблему? Кажется, совсем нет. В Google есть множество результатов, но даже здесь, на SO, вы найдете множество ответов, говорящих одинаково.
  • 0
    возможный дубликат вывода Prettifying / Formatting в SimpleXML
Показать ещё 2 комментария
Теги:

2 ответа

0
Лучший ответ

Прежде всего вам удалось узнать, что DOMDocument поддерживает форматированный XML, а SimpleXMLElement - нет. И это абсолютно правильно.

Так как вы хотите использовать SimpleXMLElement для фактического создания XML-документа, но вы также хотите воспользоваться опциями форматирования из DOMDocument, вам может понадобиться узнать о том, что обе библиотеки являются сестринскими библиотеками, которые очень хорошо работают друг с другом. Вы уже вроде, кажется, знают о том, что, как вы используете simplexml_import_dom для преобразования объекта DOMNode в него SimpleXmlElement опротестовать.

Вы, похоже, не знаете, как близко вы уже были. Пожалуйста, просмотрите следующий пример, который я скопировал из вашего вопроса. Я просто добавил одну строку в самом конце (и изменил имя файла на стандартный вывод, чтобы он перекликался с документами):

$dom = new domDocument;

$dom->formatOutput = true;
$root = $dom->appendChild($dom->createElement( "user" ));
$sxe = simplexml_import_dom( $dom );
$sxe->addChild("firstname", "John");
$sxe->addChild("surname", "Brady");

$sxe->asXML('php://output');
$dom->save('php://output');

Метод SimpleXMLElement::saveXML() будет использовать DOMDocument::save() вывод, в то время как метод DOMDocument::save() будет использовать форматирование при настройке параметров для:

<?xml version="1.0"?>
<user><firstname>John</firstname><surname>Brady</surname></user>
<?xml version="1.0"?>
<user>
  <firstname>John</firstname>
  <surname>Brady</surname>
</user>

И это уже.

0

этот код работал для меня, и он также довольно чистый:

header('Content-type: text/xml');

echo $xml->asXML();

где $ xml - это SimpleXMLElement - этот код будет печатать XML следующим образом

<Attribute>
   <ChildAttribute>Value</ChildAttribute>
</Attribute>

Это взято из официальной документации PHP SimpleXMLElement :: asXML

Надеюсь, что это поможет вам!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню