3

空の文字列を値として (または空白を使用して) addChild を呼び出すと、値のないノードだけを追加するのではなく、冗長な SimpleXml ノードがノード内に追加されるようです。

何が起こるかの簡単なデモを次に示します。

[description] => !4jh5jh1uio4jh5ij14j34io5j!

そして、ここに空の文字列があります:

[description] => SimpleXMLElement Object ( [0] => ) 

私が現在使用している回避策はかなりひどいものです - 最終的な JSON で str_replace を実行して、!4jh5jh1uio4jh5ij14j34io5j! を置き換えています。空の文字列で。うん。おそらく、この時点での唯一の答えは、「simplexml にバグ レポートを送信する」ことです...

誰かがより良い解決策を持っていますか?

4

4 に答える 4

1

SimpleXML では、print_r()、var_dump()、serialize() などを使用した場合に得られるものは、オブジェクトの内部に格納されているものと一致しません。これは、PHP がコンテンツを相互に処理する方法をオーバーロードする「魔法の」オブジェクトです。

AsXML() のみを使用して、要素の真の表現を取得します。

print_r() のようなものが SimpleXML 要素を繰り返し処理するか、-> 演算子を使用してそのプロパティにアクセスすると、オブジェクトの変更されたバージョンが得られます。この変更されたバージョンでは、"echo $xml->surname" や $xml->names[1] などを、実際にプロパティとして持っているかのように実行できますが、変更された表現要素内に含まれる真の XML とは分離されています。名前が PHP の予約語 (「var」など) である要素は、プロパティとして表示されませんが、オブジェクトが連想配列であるかのように、$xml["var"] のようなコードでアクセスできます。 . 複数の兄弟要素が同じ名前を持つ場合、それらは配列のように表示されます。なんらかの理由で空の文字列も配列のように表示されていると思います。ただし、AsXML() を使用して出力すると、実際の表現が得られます。

于 2009-04-09T04:37:31.917 に答える
1

何が起こっているのか理解できたと思います。次のようなコードが与えられた場合:

$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node','value');
print_r($xml);

$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node','');
print_r($xml);

$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node');
print_r($xml);

出力は次のとおりです。

SimpleXMLElement Object
(
    [node] => value
)
SimpleXMLElement Object
(
    [node] => SimpleXMLElement Object
        (
            [0] => 
        )

)
SimpleXMLElement Object
(
    [node] => SimpleXMLElement Object
        (
        )

)

したがって、#2 の場合に空の要素が作成されないようにするには (つまり、2 番目の引数が空の文字列になるかどうかわからない場合)、次のようにすることができます。

$mystery_string = '';

$xml = new SimpleXMLElement('<xml></xml>');
if (preg_match('#\S#', $mystery_string)) // Checks for non-whitespace character
  $xml->addChild('node', $mystery_string);
else
  $xml->addChild('node');

print_r($xml);
echo "\nOr in JSON:\n";
echo json_encode($xml);

出力するには:

SimpleXMLElement Object
(
    [node] => SimpleXMLElement Object
        (
        )

)

Or in JSON:
{"node":{}}

それはあなたが望むものですか?

個人的には、私は SimpleXML を使用したことがありません。これは、この種の奇妙な動作のためだけでなく、まだ主要な開発段階にあり、PHP5 では DOM 操作に必要なメソッド (deleteChild、replaceChild など) の 2/3 が欠落しています。 .

私は DOMDocument を使用します (これは libxml2 へのインターフェースであるため、標準化され、高速で機能が完備されています)。

于 2008-11-03T11:10:16.173 に答える
0

質問を正しく理解していないかもしれませんが、addChildメソッドを使用する場合、ノード内のコンテンツに関係なく、ノード名の引数として文字列が必要であるように思われます。値(2番目の引数)はオプションであり、ノードを追加して空にするために空白のままにすることができます。

それが役に立ったら教えてください。

于 2008-10-29T15:57:39.953 に答える
0

simpleXml オブジェクトを拡張して、DOMDocument に存在するすべての機能を含める Xml ライブラリを作成しましたが、SimpleXml からのインターフェイスがありません (2 つの関数が同じ基礎となる libxml2 オブジェクトと対話するため、参照により)。AsArray() や AsJson() などの優れた機能もあり、オブジェクトをこれらの形式のいずれかで出力します。

JSON を出力するときに期待どおりに動作するようにライブラリを更新しました。次のことができます。

$xml = new bXml('<xml></xml>');
$xml->addChild('node', '');
$json_w_root = $xml->asJson(); // is { 'xml': {'node':'' } }
$json = $xml->children()->asJson(); // is { 'node' : '' } as expected.

ライブラリは、 http://code.google.com/p/blibrary/の Google コードでホストされています。

于 2009-01-03T04:53:32.737 に答える