DOM で XML 文書を結合する例を探していたら、下記のものが見つかりました。

http://www.atmarkit.co.jp/fxml/askxmlexpert/020m …

これを参考に、PHP5 でテストするために、下記のスクリプトを作成しました。

<?php
$r1 = new DomDocument;
$r1->loadXML("<Items><Item>a</Item></Items>");
$r1rt = $r1->documentElement;

$r2 = new DomDocument;
$r2->loadXML("<Item>b</Item>");
$r2rt = $r2->documentElement;

$r1rt->insertBefore($r2rt,null);

$r1->encoding = "utf-8";
print $r1->saveXML();
?>


このスクリプトを実行すると、insertBefore のところで例外が発生しエラーになってしまいます。何が悪いのでしょうか?

最終的にやりたいのは XML 文書を結合するということなので、DOM にはこだわりません。何か良い方法があれば、お知恵をお貸し下さい。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

# ソースにコメントをつけて回答します。



$r1 = new DomDocument;
$r1->loadXML("<Items><Item>a</Item></Items>");
$r1rt = $r1->documentElement;

$r2 = new DomDocument;
$r2->loadXML("<Item>b</Item>");
$r2rt = $r2->documentElement;

# 違うXMLドキュメントからコピーする場合はちゃんと
# importNodeを行いましょう。
$r2rt_copy = $r1->importNode($r2rt, true);

# 最後に付け加えるならappendChildを用いたほうがいいと思います。
$r1rt->appendChild($r2rt_copy);

$r1->encoding = "utf-8";
print $r1->saveXML();

# PHPの経験は少ないので記述ミスがあると思います。
# そこは直してください(*^^*)
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む

QPHPでの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>

字数制限の為に、コードも必要最低限だと思われるものしか
記述していません。これでは分からないという事であれば
追記で記述しますので、分かる方は是非教えてください。
よろしくお願いします。

XMLの編集・削除をPHPで行いたいと思っています。
その際に、どの要素なのかを指定したいと思うのですが
なかなか方法が分からずに困っています。

調べてみて、Xpathを利用して指定し
削除をする時には DOMNode = DOMNode->removeChild(ノード)
編集する時には DOMNode->nodeValue = 値
と、いうものを利用すればいいのかな?と分かってきたのですが
実際、PHPに組み込んでみても、動いてくれず分からなくなっています。

【削除PHP】
foreach ($_POST['number'] as $key => $value){
$xpath = new ...続きを読む

Aベストアンサー

以下でどうでしょうか。

// recordノードを取得
$xpath_record = $xpath->query("//record[@number=$session_number]")->item(0);

// recordノードを削除
$xpath_record->parentNode->removeChild($xpath_record);

QXMLで要素が記述された順番に意味を持たせたらダメ?

仕事でXMLを読み込むプログラム(java)を作っています。

<text>
<sentence>1行目</sentence>
<sentence>2行目</sentence>
</text>

例ですが、上記のXMLを自分で考え、それを読み込んで順番に表示するプログラムを作ったところ上司に
「XMLの仕様では、要素は記述された順番に読み込まれるとは限らないよ」
と言われましたが、これは本当ですか?
参考になるサイトや書籍があれば教えて下さい。よろしくお願いします。

XMLの仕様の日本語訳をざっと読みましたが、よく分かりませんでした。
更に、下記の記事を読んでみましたが、これもよく理解できませんでした。
http://www.ibm.com/developerworks/jp/xml/library/x-eleord/index.html

Aベストアンサー

>「XMLの仕様では、要素は記述された順番に読み込まれるとは限らないよ」

本当です。
質問者様の参考サイトにも記述されていますが
XMLにはパーサーの読み込み順序の規定は何もありません。

従いまして、パーサーによって読み込まれたXML要素の順序性は保証されず、
使用するパーサーに完全に依存することになります。
ただ、読み込み時にわざわざ要素を入れ替えるというパーサーを今までに私は見たことがありません。
(そもそも読み込む順序をわざわざ入れ替える理由も無いですから)

ちなみにJavaならorg.w3c.domパッケージのElementクラスの
getElementsByTagNameメソッドなどは「文書順に返す」といった記述が見られますね。
(ただ、Nodeインターフェースのメソッドはそういった記述が見当たらないですけど)

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

Q同じソリューション内の別のプロジェクトのメソッド呼び出し

同じソリューション内の別のプロジェクトのメソッド呼び出し

お世話になっております。
Visual Studio でC#で開発をしております。
初心者です。

同じソリューション内にある別のプロジェクトのメソッドを呼び出す方法は
どの様にしたら宜しいのでしょうか。
下記の様に記述しましたら、
「静的でないフィールド、メソッド、またはプロパティ ~省略~ で、
 オブジェクト参照が必要です」と言うエラーが出てしまいます。
何か根本的に間違っているのかも知れません。

何卒、ご教授頂きたく宜しくお願い致します。

        記

呼び出し側
private void button1_Click(object sender, EventArgs e)

  呼び出し先のプロジェクト名.クラス名.メソッド名();
 }


呼び出される側
namespace プロジェクト名

public class クラス名

   メソッド名()
   {
     処理内容
    }
  }
 }

Aベストアンサー

ソリューション エクスプローラにおいて、呼び出し側のプロジェクト ツリーの「参照設定」を右クリックして、「参照の追加」を実行、ダイアログの「プロジェクト」タブにおいて、呼び出される側のプロジェクトを選択してOKを押してください。
Visual C#のインテリセンスが正常に機能し始めれば設定が成功しています。

なお、参照設定の追加により、参照されるアセンブリは参照するプロジェクトの出力フォルダに自動的にコピーされるようになります。
また、被参照アセンブリのプログラム デバッグ データベース ファイル(.pdb)も自動的にコピーされるので、被参照側のソースにブレークポイントを置いて参照側でデバッグを開始すると、きちんとブレークポイントで停止してくれます。

QXMLのタグの有無をPHPで判定したい。

example1.xml
-----------------------
<item>
 <color>red</color>
 <omake>candy</omake>
</item>
-----------------------

example2.xml
-----------------------
<item>
 <color>black</color>
</item>
-----------------------

上記はXMLファイルの2パターンを示したものです。

商品(item)によって、オマケ(omake)があったりなかったりします。
オマケがない時には、タグ自体存在しません。

なので、タグがない時に、そのデータをDOMで取得しようとすると、
エラーが吐かれます。
Notice: Trying to get property of non-object in~~~

私がしたいことは、
タグがない場合には、値を取得しない。
という分岐をさせることです。

例えば、

$items = $doc->getElementsByTagName('color');
if(isset($items)){echo $items->item(0)->nodeValue;}

こんな感じで考えたのですが、ダメでした。
タグが無くても、$itemsはNULLではないため、
if文の中に入ってしまい、
結局、$items->item(0)->nodeValue; を通過しようとして、
Notice: Trying to get property of non-object in~~~
が吐かれます。
($itemsは、object(DOMNodeList)#3 (0) { }といった内容で、NULLではない。)

また、

if(isset($items->item(0)->nodeValue)){
 echo $items->item(0)->nodeValue;
}

のようにすると、
isset()のところで、やはり、
$items->item(0)->nodeValue
を通過しようとして、
Notice: Trying to get property of non-object in~~~
が吐かれます。

こういった場合、どうしたら良いのでしょうか。
宜しくお願いします。
(PHP5の環境です。)

example1.xml
-----------------------
<item>
 <color>red</color>
 <omake>candy</omake>
</item>
-----------------------

example2.xml
-----------------------
<item>
 <color>black</color>
</item>
-----------------------

上記はXMLファイルの2パターンを示したものです。

商品(item)によって、オマケ(omake)があったりなかったりします。
オマケがない時には、タグ自体存在しません。

なので、タグがない時に、そのデータをDOMで取得しようとすると、
エラーが吐かれます。
Notice: Trying to...続きを読む

Aベストアンサー

getElementsByTagNameはNULLを返しません。必ず、DOMNodeListを返します。
そしてDOMNodeListは、lengthというプロパティを持ちます。
ので、

<?php

$omake = $doc->getElementsByTagName('omake');

echo $omake->length; //存在しないなら『0』を返します。


?>

といった感じです。

QTreeView と DOMツリー

C# WPF でプログラミングをしています。

TreeView に XML の階層構造を表示させて、ある項目を選択し、ボタンをクリックするとその項目の子ノードが追加されるようにするプログラムを作っています。

選択した項目(TreeView.SelectedItem(Object型)) を、DOMツリーの要素ノード (XmlElement型) にキャストし、それに新しく作った要素ノード(XmlElement型)をつなげるといったようにしているのですが、その際「挿入するノードは、異なるドキュメント コンテキストのものです。」のエラーが発生してしまいます。

XmlElement tvi = treeView.SelectedItem as XmlElement;
XmlElement item = doc.CreateElement("item");
tvi.PrependChild(item); // エラー発生箇所

※ doc は XmlDocument のインスタンスです。

解決策を教えてください。よろしくお願いします。

Aベストアンサー

TreeViewで試してないので自信なし。

例外出るの。
https://ideone.com/fQ04I
こうすると出ないの。
https://ideone.com/e3HEI


人気Q&Aランキング