Формат XML-строки
Каков наилучший способ форматирования XML в классе PHP.
$xml = "<element attribute=\"something\">...</element>";
$xml = '<element attribute="something">...</element>';
$xml = '<element attribute=\'something\'>...</element>';
$xml = <<<EOF
<element attribute="something">
</element>
EOF;
Я уверен, что это последний!
Ответы
Ответ 1
С DOM вы можете сделать
$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML('<root><foo><bar>baz</bar></foo></root>');
$dom->formatOutput = TRUE;
echo $dom->saveXML();
дает (живая демонстрация)
<?xml version="1.0"?>
<root>
<foo>
<bar>baz</bar>
</foo>
</root>
См. DOMDocument::formatOutput
и DOMDocument::preserveWhiteSpace
описание свойств.
Ответ 2
Эта функция работает идеально, так как вам не нужно использовать какую-либо библиотеку xml dom или ness, просто передайте в нее генерированную строку xml, и она будет анализировать и генерировать новую с помощью вкладок и разрывов строк.
function formatXmlString($xml){
$xml = preg_replace('/(>)(<)(\/*)/', "$1\n$2$3", $xml);
$token = strtok($xml, "\n");
$result = '';
$pad = 0;
$matches = array();
while ($token !== false) :
if (preg_match('/.+<\/\w[^>]*>$/', $token, $matches)) :
$indent=0;
elseif (preg_match('/^<\/\w/', $token, $matches)) :
$pad--;
$indent = 0;
elseif (preg_match('/^<\w[^>]*[^\/]>.*$/', $token, $matches)) :
$indent=1;
else :
$indent = 0;
endif;
$line = str_pad($token, strlen($token)+$pad, ' ', STR_PAD_LEFT);
$result .= $line . "\n";
$token = strtok("\n");
$pad += $indent;
endwhile;
return $result;
}
Ответ 3
//Вот пример использования XMLWriter
$w = new XMLWriter;
$w->openMemory();
$w->setIndent(true);
$w->startElement('foo');
$w->startElement('bar');
$w->writeElement("key", "value");
$w->endElement();
$w->endElement();
echo $w->outputMemory();
//out put
<foo>
<bar>
<key>value</key>
</bar>
</foo>
Ответ 4
Первое лучше, если вы планируете внедрять ценности в XML, второе лучше для людей читать. Ничего хорошего, если вы действительно работаете с XML.
Однако, если вы намереваетесь выполнить простую функцию пожара и забывания, которая принимает XML в качестве входного параметра, я бы сказал, используя первый метод, потому что вам нужно будет внедрить параметры в какой-то момент.
Я лично использовал бы PHP-класс simplexml, он очень прост в использовании, и он встроил поддержку xpath, чтобы детализировать данные, возвращенные в XML, сон.