0

XML 宛ての PHP 文字列から改行を削除するための推奨される方法を考えています。次の方法を使用すると、XML タグ間に 2 ~ 4 個のさまざまなスペースが残ります。

$current = $xml->saveXML();
$current = str_replace(array("\r\n", "\r", "\n"), "", $current);

改行を削除して XML タグがエンドツーエンドで表示され、間にスペースが追加されないようにする適切な構文は何ですか?

4

1 に答える 1

2

まずいくつかの基本的なこと: $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" => ''));

以上です。これがお役に立てば幸いです。

于 2013-04-08T08:29:31.920 に答える