simplexml
オブジェクトからノード値を取得する方法はありませんか?キャストしますか?simplexml型キャストなしでノード値を取得する
$amount = (int)$item->amount;
これは私の意見ではあまり美しくはありませんが、私はよりクリーンな方法を探していますが、今まで何も見つかりませんでした!
//wouldn't this be nice?
$amount = $item->amount->getValue();
ありがとうございます。
simplexml
オブジェクトからノード値を取得する方法はありませんか?キャストしますか?simplexml型キャストなしでノード値を取得する
$amount = (int)$item->amount;
これは私の意見ではあまり美しくはありませんが、私はよりクリーンな方法を探していますが、今まで何も見つかりませんでした!
//wouldn't this be nice?
$amount = $item->amount->getValue();
ありがとうございます。
タイプキャストしなくてもノードの値を取得できますか?確実なこと! :3
class SimplerXMLElement extends SimpleXMLElement
{
public function getValue()
{
return (string) $this;
}
}
今、あなただけでも単純 XML要素を取得するためにsimplexml_load_string()
の二番目のパラメータを使用する必要があります!
さらに深刻なことに、ノードはノードです。ノードの値を文字列、整数、およびそれ以外のものとして使用する必要がある場合は、個人的に行ってもいなくても、ある時点での型キャスティングが必要になります。
あなたは不正行為をしています。値はまだ型キャストされています。それは公正な解決策ですが、私の質問に対するコメントの中でDOMの冗長さに不平を言うのは皮肉なことですが、DOMがすぐに提供する機能を提供できるようにSimpleXmlを拡張することを提案します。 SimpleXml APIのすべての欠点に対してこれを行うなら、あなたは単にDOMを改革しているだけです。 – Gordon
あなたはポイントがありません。そのクラスは、あなたがそれを認識しているかどうかにかかわらず、いつも型キャスティングがどこかで発生するという舌のような例です。申し訳ありませんが、それを取得していない。 –
@Joshむしろ、私は何とかあなたのペットのXML拡張を侮辱したような印象を受けました。それとも、あなたが私を苦しめている理由が他にありますか?事実は、OPはPHPの型キャストが何であるかを質問していませんでしたが、SimpleXmlElementからノードの値を取り出して、明示的にスクリプトにキャストせずに取り出せるかどうかを尋ねました。あなたが「スクリプトではなくインスタンスにキャストされています」というような言い方が好きでない限り、答えはNoです。私は確かにしません。私が言ったように、あなたのソリューションは公正ですが、私はまだSimpleXmlにDOMを利用できるときにメソッドを追加することは時間の無駄だと思っています。同意しないでください。 – Gordon
しかし、それは最も安全です。配列内のオブジェクトを再帰的に変換する関数を作成することができます。私が最初にPHPでXMLを使って作業を始めたとき、型キャストが単なる最良のメソッドであるという結論に達したことを覚えています:)
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を見てください。
不明な理由があるため、XMLを処理するためにはるかに複雑な方法を使用することをお勧めします。 OPは「よりクリーンな」ソリューションを探していますが、DOMはSimpleXMLより遥かに冗長であり、その記述に合っているかどうかは疑問です。 –
@Josh私は、SimpleXmlが提供する暗黙的なインターフェイスよりもはるかにクリーンであることを明示的に伝達するAPIを持つことを検討します。はい、DOMは冗長ですが、(SimpleXmlには手がかりがない)さまざまなノードタイプを扱うことが可能です。さらに、DOMは言語に依存しないインタフェース仕様であるため、言語固有の拡張で学習することができます。 – Gordon
アレックスがDOM機能を必要としているかどうか分かりませんので、知らない理由でDOMを暗黙のうちに提案しています。私はなぜあなたがそれらのノードタイプを持ち出しているのか分からない。私はアレックスが探している価値がPIに隠されているのか疑問だ。 DOMを知らない/必要としないユーザーに公平になるためには、XMLを読み込んでその値をDOMを使用して数値または文字列として取得する方法を追加するのはどうでしょうか? –
xpath方法はどうですか?
$amount = $item->amount->xpath('text()');
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