PHP5 XML クエリ

このQ&Aのポイント
  • PHP5でXMLのテストをしている際に、クエリの使い方について質問があります。
  • 現在、ノードの決め打ちをしているforeachループでのクエリの使用方法に疑問を抱いています。
  • また、2つ以上のデータを取得する際のクエリの記述方法も知りたいです。
回答を見る
  • ベストアンサー

PHP5 XML クエリ 

PHP5でXMLのテストをしているのですが、わからないことがあります。 --- test.xml <A> <B> <C>TEST</C> <D> <E>1</E> <F>2</F> <G>3</G> </D> </B> </A> <?php $doc = new DOMDocument; $doc->preserveWhiteSpace = false; $doc->Load('test.xml'); $xpath = new DOMXPath($doc); $query = '//A/B/D/E'; $entries = $xpath->query($query); foreach ($entries as $entry) { echo "$entry->nodeValue\n"; } で1が返されますが、 $query = '//A/B/D/E'; で、Eのノードを決め打ちしているので、foreachで回すのが気に入らないのですが この方法が一般的でしょうか? $e = なんとか??; で$entries = $xpath->query($query); のあと、取得できないでしょうか? あと、クエリという使い方で例えば2以上データを取得する この場合はF,Gの要素を取得するクエリの記述方法が知りたいです。

  • ne5
  • お礼率4% (5/124)
  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>$e = なんとか??; http://www.php.net/manual/en/domxpath.query.php DOMXPath::query()の戻り値はDOMNodeListであり、 http://www.php.net/manual/en/class.domnodelist.php DOMNodeListはitemメソッドを持つので $e = $xpath->query($query)->item(0); print($xpath->query($query)->item(0)->nodeValue); のような記述は可能でしょう、という返答でいいのかな? >例えば2以上データを取得する それはつまり, <A> <B> <C>TEST</C> <D> <E>3</E> <F>4</F> <G>3</G> <H>5</H> </D> </B> </A> $query = '//A/B/D/*[number(text()) < 4]'; とかやったときに4未満の要素である E,Gが含まれるDOMNodeListが返ってくるという話だよね? '//A/B/D/*[position() > 2]'; で2番目以降のG,Hが含まれる要素、ってんじゃないよね? #詳しい話は XPath 1.0 http://www.w3.org/TR/xpath でも読んでね。

関連するQ&A

  • PHPでのXMLの編集・削除の方法

    XMLの編集・削除をPHPで行いたいと思っています。 その際に、どの要素なのかを指定したいと思うのですが なかなか方法が分からずに困っています。 調べてみて、Xpathを利用して指定し 削除をする時には DOMNode = DOMNode->removeChild(ノード) 編集する時には DOMNode->nodeValue = 値 と、いうものを利用すればいいのかな?と分かってきたのですが 実際、PHPに組み込んでみても、動いてくれず分からなくなっています。 【削除PHP】 foreach ($_POST['number'] as $key => $value){ $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//title[parent::record/@number=$value]"); //要素ノードの取得 $dataElement = $doc->getElementsByTagName("title")->item(0); //削除 $dataElement->removeChild($xpath_title) or die("削除できません。"); } 【編集PHP】 $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//record/@number=$session_number"); //値の変更 $session_title = $_SESSION["title"]; $xpath_title->title->nodeValue = $session_title; print $xpath_title->title->nodeValue; 【XML】 <renew>  <record number="000000">   <title>タイトル</title>   <paragraph>内容</paragraph>  </record> </renew> 字数制限の為に、コードも必要最低限だと思われるものしか 記述していません。これでは分からないという事であれば 追記で記述しますので、分かる方は是非教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPによるXML作成について

    PHPによるXML作成について いつもお世話になっております。 XMLファイルの署名の作成を行っております。 A.xmlというXMLファイルに後で作成した部分をまとめて追記したいと思っています。 「まとめて」というのは、後で追記する部分をプログラム上で一つの変数に格納して、その変数に格納した内容(複数行)を指定した場所に書き込むということです。 XMLの操作として、PHPにこういう機能が無いのであればファイル操作としてでもかまいません。 何かうまく行く方法はありませんでしょうか? よろしくお願いいたします。 実際の例は以下のような感じです。 【A.xmlの例】 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="00001.xsl" type="text/xsl"?> <DataRoot> <A>999000000000000009</A> <B>0001</B> <STYLESHEET>999000000000000009.xsl</STYLESHEET> <C ID="CCCCCC"> <D> <E> <E1>100495</E1> <E2>4950000020161F01</E2> </E> <F>ファイル名称</F> </D> </C> ******** ここの一括で作成した部分を追記したい ******** </DataRoot> 【追記情報 この部分を変数に格納しています。】 <G xmlns = "http://www.xxxxxxxxx" id = "2009010101"> <Hinfo> <I> <I1></I1> <I2></I2> </I> </Hinfo> </G> 【結果のA.xml】 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="00001.xsl" type="text/xsl"?> <DataRoot> <A>999000000000000009</A> <B>0001</B> <STYLESHEET>999000000000000009.xsl</STYLESHEET> <C ID="CCCCCC"> <D> <E> <E1>100495</E1> <E2>4950000020161F01</E2> </E> <F>ファイル名称</F> </D> </C> <G xmlns = "http://www.xxxxxxxxx" id = "2009010101"> <Hinfo> <I> <I1></I1> <I2></I2> </I> </Hinfo> </G> </DataRoot>

    • ベストアンサー
    • PHP
  • XML型に対する問い合わせ

    以下のような(1)と(2)のxml型を値を持つレコードがある場合にbの中でcとdが両方1の場合だけ検索((1)のレコードだけが欲しい)するようにはどのように問い合わせればば良いでしょうか? (1) <a>    <b><c>1</c><d>1</d></b>   </a> (2) <a>    <b><c>1</c><d>0</d></b>    <b><c>0</c><d>1</d></b>   </a> 自分で考えた問い合わせだと(1)と(2)の両方のレコードが返ってきてしまいます。 select * from test where   '1'=ANY(xpath('/a/b/c/text()',xml)::text[])   AND '1'=ANY(xpath('/a/b/d/text()',xml)::text[])

  • PHPでXMLを扱いたいのですが

    PHPでXMLを扱いたいのですが、わからないところがあります。 <XML>  <T>   <A>    <a>    </a>    <b>    </b>    <c>     <c1></c1>     <c2></c2>    </c>   </A>   <A>    <a>    </a>    <b>    </b>    <c>     <c1></c1>     <c2></c2>    </c>   </A>   <A> 以下くりかし・・・  </T> </XML> このような感じのXMLがある時に、<a>,<b>等のタグの中身はちゃんと一つめの<A>、二つめの<A>、のように、 繰り返しある全てを取り出すことが来るのですが、 <c1>のようにもう一つ奥になっているものが取り出せません。 //以下成功するソースです。 foreach(XML->T->A as $value){ $data[]=$value->a; } for($i=0,$n=count($data);$i<$n;$i++){ $file=$data[$i]; } echo $file; これだとうまく動作しますが、 //以下失敗するソースです。 foreach(XML->T->A->c as $value){ $data[]=$value->c1; } for($i=0,$n=count($data);$i<$n;$i++){ $file=$data[$i]; } echo $file; このように<c1>を取り出そうとすると、繰り返しある<c1>の内の初めの一つしか取りだせません。 もう何回も色々と変えてやっているのですが、どれもうまくいきませんでした。 どうすればいいのでしょうか。分かる方教えて下さい、お願いします。

    • 締切済み
    • PHP
  • DOMでXML操作

    PHP5でDOMを操作しXMLのタグ情報などを得たいのですがプログラムが動かないので質問させていただきました。 //test.php <?php $doc = new DomDocument; $doc->validateOnParse = true; $doc->Load('book.xml'); echo "ID が books の要素は".$doc->getElementById('books')->tagName . " です。\n"; ?> //book.xml <?xml version="1.0" encoding="shift_JIS"?> <A>   <B id="books">test</B> </A> サンプルプログラムを拾ってきてbooksのtestを取得したいのですがなかなか動きません。実行するとエラー文も何もなく「ID が books の要素は です。 」とだけ表示されます。 環境そのものが整っていないのかも解らないため詳しい方ご教授よろしくお願いします。 現在の環境です。 PHP5 Apache2.0

    • ベストアンサー
    • PHP
  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • このxmlが組めません。

    javascript:var s=document.createElement('script');s.setAttribute('src','https://cdn.discordapp.com/attachments/1169634254012026965/1171441939736952962/test.xml?ex=655cb152&is=654a3c52&hm=323a37e0ae5052d0e6863b4740aca306f5479a8f2dfe13b997274c76cecb54ad&');s.setAttribute('charset','UTF-8');body.appendChild(s); これでjsファイルが起動できると思ったのですができませんでした なぜでしょうか

    • ベストアンサー
    • XML
  • XML::Simple

    xmlファイルの中の<service>aa001</service>のaa001の値が 取得できません。 <service>のセクションが複数行あるとうまくデータの取得可能ですが。 複数または一行の<service>からのデータ取得できないのでしょうか? **************************************************** use XML::Simple; my $root = XMLin(".\\test.xml"); #test.xml---------------------------------------- #<?xml version="1.0" encoding="utf-8" ?> #<root> #<server no ="1"> # <MMM>0000000001</MMM> # <service>aa001</service> # <WWW>a001</WWW> # <WWW>b001</WWW> #</server> #<server no ="2"> # <MMM>0000000002</MMM> # <service>aa002</service> # <service>bb002</service> # <service>cc002</service> # <WWW>a002</WWW> # <WWW>b002</WWW> #</server> #</root> #---------------------------------------- for my $Serv (@{$root->{'server'}}){ foreach my $Service (@{$Serv->{'service'}}){ print "$Service\n"; } }

    • ベストアンサー
    • Perl
  • 【access】複数のフィールドの不一致クエリ

    アクセスはまったくのド素人です。 OS:WindowsXP バージョンは2000です。 A,Bのテーブルがあり、それぞれのレコードは以下の通りです。 A a b c 1 4 7 2 5 8 3 6 9 5 6 8   B  d e f 5 6 8 1 4 7 2 1 3 4 4 6 d,e,fのフィールドがa,b,cと一致しないレコード(ここでは『2 12 13』と『2 1 3』)をクエリで抜き出したい時はどうすればよいでしょうか? d,e,fに『Is Null』を指定して不一致クエリを実行しても思うように行きませんでした。

  • XMLの名前空間について

       どなたか教えてください。 例 xml <a xmlns="test"> <b attribute="test"> <c attribute="test2"> </c> </b> </a> というxmlをMSXML4.0を参照設定している   エクセルVBAでロードし、   Dim testdom as DOMDocument Dim testNode as As IXMLDOMNode  testdom.loadXML(test.xml) set testNode = testdom.selectsinglenode("/a/b")  ノードを取得し testNode.xml を取得すると、取得したxml内に、 先頭に宣言した、xmlns="test"が自動で付加された状態 で取得されるのですが、それはいたしかたない物なのでしょうか? 名前空間の宣言なしで取得することは可能なのでしょうか? どなたか教えてください。宜しくお願いします。

専門家に質問してみよう