PHP DOM добавляет ребенка с новой строкой

Мое имя Rithy.

Я не знаю, как добавить новую строку прежде, чем добавить новый узел или элемент в 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/>

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

5
задан boroboris 19 August 2016 в 12:49
поделиться

1 ответ

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

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

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

Ваш код дает мне следующее:

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

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

Если вы скажете $ 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>

потому что это изменит содержимое текстовых узлов внутри .

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

2
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: