XML 宛ての PHP 文字列から改行を削除するための推奨される方法を考えています。次の方法を使用すると、XML タグ間に 2 ~ 4 個のさまざまなスペースが残ります。
$current = $xml->saveXML();
$current = str_replace(array("\r\n", "\r", "\n"), "", $current);
改行を削除して XML タグがエンドツーエンドで表示され、間にスペースが追加されないようにする適切な構文は何ですか?
まずいくつかの基本的なこと: $xml->saveXML()
SimpleXML を使用していることを示唆しています。出力で行区切り文字を 1 つだけ使用します: "\n"
.
"\r\n"
したがって、 andを検索するの"\r"
は間違っています。また、使用str_replace()
することはお勧めできませんstrtr()
。代わりに使用する必要があります。
$current = strtr($current, array("\n" => ''));
これは改行を置き換えるだけなので、XML 要素間のスペース文字はここでは削除または変更されません。
ただし、これらの空白文字は、入力 XML に大きく依存します。また、XML では、重要な空白 (削除すると失敗する) と重要でない空白 (削除して保存) を使用できますが、SimplexmlまたはDOMDocumentでは、どちらがどれであるかを認識できません (また、認識できません)。
図書館自体は知らないので、図書館に知らせる必要があるのはあなたです。たとえば、すべてのテキストノードのトリミングを探しているようです。SimpleXMLElementではテキストノードへのアクセスが許可されていないため、DOMXPathを使用する必要があります。しかし、心配する必要はありません。それほど複雑ではありません。
$doc = dom_import_simplexml($xml)->ownerDocument;
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//text()') as $text) {
$text->data = trim($text->data);
}
これは、ドキュメントの順序ですべてのテキスト ノードを繰り返し処理し、それらをトリミングするだけです。
次に、ドキュメント要素で始まる XML を取得するだけです。これにより、XML 宣言とその前のコメントと処理命令が削除されます (必要だと思います)。
$current = $doc->saveXML($doc->documentElement);
そうでない場合は、上記の行区切りルールが適用されます。代わりに次のことができます。
$current = $xml->saveXML();
$current = strtr($current, array("\n" => ''));
以上です。これがお役に立てば幸いです。