web-dev-qa-db-ja.com

PHP <?xml version = "1.0" encoding = "UTF-8"?>なしのDomDocument出力

domDocumentに最初の行を削除するオプションはありますか?

<?xml version="1.0" encoding="UTF-8"?>

クラスのインスタンス化は自動的にそれを出力に追加しますが、それを取り除くことは可能ですか?

25
user398341

HTMLを出力する場合は、saveHTML()関数を使用します。多くのXMLイディオムを自動的に回避し、閉じた/閉じていないHTMLイディオムを適切に処理します。

XMLを出力する場合は、DOMDocumentDOMNode(つまり、XPath式では '/')であるという事実を使用できるため、DOMNodeAPI呼び出しを使用できます。子ノードを反復処理し、各子ノードでsaveXML()を呼び出します。これはXML宣言を出力せず、他のすべてのXMLコンテンツを適切に出力します。

例:

$xml = get_my_document_object();
foreach ($xml->childNodes as $node) {
   echo $xml->saveXML($node);
}
12
user268396

DOMDocumentの使用は、有効なXMLファイルのユニバーサルソリューションだと思います。

Xmlがすでに変数にロードされている場合:

$t_xml = new DOMDocument();
$t_xml->loadXML($xml_as_string);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

ディスクからのXMLファイルの場合:

$t_xml = new DOMDocument();
$t_xml->load($file_path_to_xml);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

このコメントは役に立ちました: http://www.php.net/manual/en/domdocument.savexml.php#88525

25
hrvoj3e

出力バッファリングを使用して削除できます。少しハックしますが、機能します。

ob_start();

// dom stuff

$output = ob_get_contents();
ob_end_clean();

$clean = preg_replace("/(.+?\n)/","",$output);
0
Byron Whitlock

私にとって、上記の答えはどれもうまくいきませんでした:

$dom = new \DOMDocument();
$dom->loadXXX('<?xml encoding="utf-8" ?>' . $content);  // loadXML or loadHTML
$dom->saveXML($dom->documentElement);

部分的なHTMLがある場合、上記は機能しませんでした。

<p>Lorem</p>
<p>Ipsum</p>

その後、<p>Lorem</p>以降のすべてを削除しました。

私のために働いた唯一の解決策は:

foreach ($doc->childNodes as $xx) {
    if ($xx instanceof \DOMProcessingInstruction) {
        $xx->parentNode->removeChild($xx);
    }
}
0
Luke Madhanga