PHP DOM добавляет ребенка с новой строки - PullRequest
4 голосов
/ 01 июля 2010

Меня зовут Рити.

Я не знаю, как добавить новую строку перед добавлением нового узла или элемента в XML.

Мой php:

$dom = new DOMDocument();

$dom->formatOutput = true;

$dom->preserveWhiteSpace = true;

$dom->load($xml_file);

$body = $dom->getElementsByTagName('body')->item(0);

$newelement_seg = $dom->createElement('seg');

$data = $dom->createTextNode(" text 2 ");  

$newelement_seg->appendChild($data);

$body->appendChild($newelement_seg);

$dom->save($xml_file);

XML До добавления нового дочернего элемента:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <seg>
        text 1
    </seg>
</body>
</xml>

XML после добавления нового дочернего элемента:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <seg>
        text 1
    </seg>
    <seg>
        text 2
    </seg>
</body>
</xml>

Но я хочу:

<?xml version="1.0" encoding="UTF-8"?>
    <body>
        <seg>
            text 1
        </seg>
        <seg>
            text 2
        </seg>
    </body>
</xml>
<hr/>

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 04 января 2011

ДЛЯ ПОДВЕДЕНИЯ ДАННЫХ ОТВЕТОВ:

  1. Вы должны установить для formatOutput значение true

  2. Вы должны установить ignoreWhiteSpace в false

т

$dom = new DomDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->load($myxmlfile);
3 голосов
/ 12 сентября 2012

Идеальное решение.Работает.Вот код, который я использовал:

       //create new document object
        $dom_object = new DOMDocument(); 

        //load xml file
        $xml_file_path = get_template_directory()."/flash/playlist.xml";
        $dom_object->formatOutput = true;    
        $dom_object->preserveWhiteSpace = false;
        $dom_object->load($xml_file_path);    
2 голосов
/ 01 июля 2010

Чего вы пытаетесь достичь?

Устанавливая preserveWhiteSpace в true (ненужно; это по умолчанию), вы говорите libxml не игнорировать текстовые узлы, состоящие только из пробелов.Тем не менее, в то же время, вы пытаетесь отформатировать XML-файл, который, чтобы быть действительно красивым, требует узлов с пробелами.

Затем, даже игнорируя пробел, вы должны реализовать пробел внутри <seg> теги значимы;libxml не удалит их;если вы заставите разрыв строки после text 1, на следующей строке закрывающий тег </seg> не должен иметь отступ, иначе содержимое текстового узла внутри тега будет отличаться.

Ваш код дает мне это:

<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
  text 1  
</seg>
<seg> text 2 </seg></body>

Поскольку вы сообщаете libxml, что пробел является значительным, он не может поставить разрыв строки после второго </seg>, в противном случае это приведет к созданию другого текстового узла.

Если вы скажете $dom->preserveWhiteSpace = false;:

<?xml version="1.0" encoding="UTF-8"?>
<body>
  <seg>
  text 1  
</seg>
  <seg> text 2 </seg>
</body>

Теги с отступом, но libxml по-прежнему не может сделать это:

<?xml version="1.0" encoding="UTF-8"?>
<body>
  <seg>
    text 1  
  </seg>
  <seg>
    text 2
  </seg>
</body>

, поскольку это приведет к изменению содержимого текстовых узлов внутри <seg>.

Возможно, вы захотите попробовать tidy , хотя я не уверен, что он будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...