2011-01-18 1 views
4

simplexmlオブジェクトからノード値を取得する方法はありませんか?キャストしますか?simplexml型キャストなしでノード値を取得する

$amount = (int)$item->amount; 

これは私の意見ではあまり美しくはありませんが、私はよりクリーンな方法を探していますが、今まで何も見つかりませんでした!

//wouldn't this be nice? 
$amount = $item->amount->getValue(); 

ありがとうございます。

+1

PHPにはこのビルドインがあります。 SimpleXMLではなく、[type-casting](http://php.net/language.types.type-juggling.php#language.types.typecasting)の嫌疑がここで問題になっているようです。しかし、あなたが主張して、代わりに関数を呼び出すことを好むなら、あなたは驚くかもしれません;)利用可能な変換関数があります。あなたの場合、それは['intval()'](http://php.net/intval)であり、['strval()'](http://php.net/strval)もあります。 – hakre

答えて

1

タイプキャストしなくてもノードの値を取得できますか?確実なこと! :3

class SimplerXMLElement extends SimpleXMLElement 
{ 
    public function getValue() 
    { 
     return (string) $this; 
    } 
} 

今、あなただけでも単純 XML要素を取得するためにsimplexml_load_string()の二番目のパラメータを使用する必要があります!

さらに深刻なことに、ノードはノードです。ノードの値を文字列、整数、およびそれ以外のものとして使用する必要がある場合は、個人的に行ってもいなくても、ある時点での型キャスティングが必要になります。

+0

あなたは不正行為をしています。値はまだ型キャストされています。それは公正な解決策ですが、私の質問に対するコメントの中でDOMの冗長さに不平を言うのは皮肉なことですが、DOMがすぐに提供する機能を提供できるようにSimpleXmlを拡張することを提案します。 SimpleXml APIのすべての欠点に対してこれを行うなら、あなたは単にDOMを改革しているだけです。 – Gordon

+0

あなたはポイントがありません。そのクラスは、あなたがそれを認識しているかどうかにかかわらず、いつも型キャスティングがどこかで発生するという舌のような例です。申し訳ありませんが、それを取得していない。 –

+0

@Joshむしろ、私は何とかあなたのペットのXML拡張を侮辱したような印象を受けました。それとも、あなたが私を苦しめている理由が他にありますか?事実は、OPはPHPの型キャストが何であるかを質問していませんでしたが、SimpleXmlElementからノードの値を取り出して、明示的にスクリプトにキャストせずに取り出せるかどうかを尋ねました。あなたが「スクリプトではなくインスタンスにキャストされています」というような言い方が好きでない限り、答えはNoです。私は確かにしません。私が言ったように、あなたのソリューションは公正ですが、私はまだSimpleXmlにDOMを利用できるときにメソッドを追加することは時間の無駄だと思っています。同意しないでください。 – Gordon

0

しかし、それは最も安全です。配列内のオブジェクトを再帰的に変換する関数を作成することができます。私が最初にPHPでXMLを使って作業を始めたとき、型キャストが単なる最良のメソッドであるという結論に達したことを覚えています:)

4

No. SimpleXmlは、暗黙のAPIは機能と見なされます。あなたは、ノードをより詳細に制御する必要がある場合は、DOMを使用します。

$sxe = simplexml_load_string(
    '<root><item><amount>10</amount></item></root>' 
); 
$node = dom_import_simplexml($sxe->item->amount); 
var_dump($node->nodeValue); // string(2) "10" 

dom_import_simplexml機能はSimpleXmlElementからDOMElementにノードを変換しますので、あなたはまだ何とか舞台裏キャストされています。 DOMElementからコンテンツを取得するときに、明示的に型キャストする必要はなくなりました。追記で

:個人的に、私はSimpleXmlからDOMは、優れた見つけ、私はすぐにSimpleXmlが、DOMを使用しないことをお勧めしたいです。あなたがそれに慣れたければ、some of my previous answers about using DOMを見てください。

+0

不明な理由があるため、XMLを処理するためにはるかに複雑な方法を使用することをお勧めします。 OPは「よりクリーンな」ソリューションを探していますが、DOMはSimpleXMLより遥かに冗長であり、その記述に合っているかどうかは疑問です。 –

+0

@Josh私は、SimpleXmlが提供する暗黙的なインターフェイスよりもはるかにクリーンであることを明示的に伝達するAPIを持つことを検討します。はい、DOMは冗長ですが、(SimpleXmlには手がかりがない)さまざまなノードタイプを扱うことが可能です。さらに、DOMは言語に依存しないインタフェース仕様であるため、言語固有の拡張で学習することができます。 – Gordon

+0

アレックスがDOM機能を必要としているかどうか分かりませんので、知らない理由でDOMを暗黙のうちに提案しています。私はなぜあなたがそれらのノードタイプを持ち出しているのか分からない。私はアレックスが探している価値がPIに隠されているのか疑問だ。 DOMを知らない/必要としないユーザーに公平になるためには、XMLを読み込んでその値をDOMを使用して数値または文字列として取得する方法を追加するのはどうでしょうか? –

0

xpath方法はどうですか?

$amount = $item->amount->xpath('text()'); 
関連する問題