• 締切済み

XMLファイルをDataSetに読込むには(C#)

現在、C#(VS2005)とXMLを勉強しています。 以下のXML (EMP:社員 EMP_CODE:社員コード、所属コード、社員コード)から、 <ROOT> <EMP> <EMP_CODE>A0325991</EMP_CODE> <EMP_KBN>92</EMP_KBN> <FROM_DATE>2004-11-22</FROM_DATE> <TO_DATE>2007-3-30</TO_DATE> </EMP> <EMP> <EMP_CODE>00491501</EMP_CODE> <EMP_KBN>11</EMP_KBN> <FROM_DATE>1998-04-08</FROM_DATE> <TO_DATE></TO_DATE> </EMP> </ROOT> EMP:社員 EMP_CODE:社員番号 EMP_KBN:雇用形態 FROM_DATE:雇用/契約開始日 TO_DATE:退職/契約解除日 C#側で定義済みのDataSet(カラムまで定義)に格納したいのですが、 XMLの項目数よりDataSet側の項目数が多いため個別にXMLから読込む 方法についてお教え願いますでしょうか。 宜しくお願い致します。

  • XML
  • 回答数1
  • ありがとう数6

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

その型指定済みのDataSetの列名(Columns[n].ColumnName)とXMLのノード名は同じなのでしょうか? 新規に追加すのであれば ... DataSet dsXML = new DataSet(); dsXml.ReadXml("Sample.XML"); DataTable tbl = dsXml.Tables[0]; // 型指定済みDataSetの型名を DSEMPと仮定 EMPDS ds = new EMPDS(); // 読み込んだXMLの行数分ループ foreach( DataRow row2 in tbl.Rows ) {   DataRow row = ds.Tables[0].NewRow();   // dsXMLのテーブルの列数分のループしてデータの流し込み   foreach( DataColumn cl in Tbl.Columns )   {     // 空フィールドは代入しない     if ( !row2[ cl.ColumnName ].Equals("") )     {       row[ cl.ColumnName ] = row2[ cl.ColumnName ];     }   }   ds.Tables[0].Rows.add( row ); } といった具合でしょう ...

関連するQ&A

  • DataSetのwriteXmlでのXML宣言

    お世話になります。 VB.NETでdatasetの値をXMLファイルに書いていますが、XML宣言部が書かれません。 同じような事象を検索してみましたが、該当するものはありませんでした。 またMSDNにも特に注意事項は記載されていません。 コードは以下のとおりとなります。 Dim filename As String = "C:\Documents and Settings\inui\My Documents\testXml\xmlWrite\XF_RACE.61.20110204.1.xml" ' Create an XmlTextWriter with the fileStream. Dim = New IO.StreamWriter(filename, False, _ System.Text.Encoding.GetEncoding("shift_jis")) ' Write to the file with the WriteXml method. _Dataset.WriteXml(xmlWriter) xmlWriter.Close() ご教授お願いしたします。

  • [Perl]Shift-JISのXMLを解析する場

    行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

  • サブクエリーのパフォーマンスについて

    こんばんわ。 ある書籍にサブクエリーを【1】より【2】にした方がパフォーマンスがいいと書いてありました。 パフォーマンスがいい理由を教えて頂けないでしょうか?? 【1】 UPDATE Absenteeism SET severity_points= 0, reason_code = 'long term illness' WHERE EXISTS (SELECT * FROM Absenteeism AS A2 WHERE Absenteeism.emp_id = A2.emp_id AND Absenteeism.absent_date = (A2.absent_date + INTERVAL '1' DAY)); 【2】 UPDATE Absenteeism AS A1 SET severity_points = 0, reason_code = 'long term illness' WHERE EXISTS (SELECT * FROM Absenteeism AS A2 WHERE A1.emp_id = A2.emp_id AND (A2.absent_date + INTERVAL '1' DAY) = A1.absent_date); よろしくお願いします。 以上

  • BROUP BY で集計し、日付で削除

    よろしくお願いします PostgreSQL 8.0.8です 現在 code date 1    2007-04-02 12:52:22.239818+09 1    2007-03-02 12:52:50.90313+09 2    2007-04-02 13:08:35.093001+09 2    2007-04-02 13:11:08.532232+09 というデータがあるとし これをcodeでグループ化して、codeが何件あるかを調べたいです ただし、dateが本日から30日以上前の場合は省くという条件をつけたいのですがエラーがでてうまくいきません SELECT code,COUNT(code) AS cnt FROM test GROUP BY code HAVING date(date) >= '30前の日付' どう書いたらうまくいくのでしょうか? よろしくお願いします。

  • MYSQL バイナリデータ変換取得

    以下のようなbatでunhex(`idm`)を使って変換しているのですが、出力されるデータが他のところも変換されて出力されます。どうしてでしょうか? characterの設定か、SQLがだめなのでしょうか? ECHO OFF SET MYSQLPATH="C:\Program Files\MySQL\MySQL Server 5.0\bin" SET character SET sjis;>create_sql.sql ECHO select unhex(`idm`),a.emp_code,a.emp_name_kana from a,b where b.emp_code=a.emp_code into outfile "C:/master.csv" fields terminated by ',';>>create_sql.sql %MYSQLPATH%\mysql.exe -u root -proot test<create_sql.sql exit

    • ベストアンサー
    • MySQL
  • ある文字列を含むノードが存在するかを判定したい

    お世話になります。 次のようなXMLファイルがあります。 <root> <data> <code>1</code> <value>aiueo</value> </data> <data> <code>2</code> <value>kakikukeko</value> </data> <data> <code>3</code> <value>aiueo</value> </data> </root> 「aiueo」が一つでも含まれている<value>ノードが存在するならば、という判定をXSLファイルの中で行いたいです。 contains関数を使うのかなと思っているのですが、ルートノードから見て孫のノードを繰り返し探す処理が分からず困っています。 プログラムの前後の処理の都合上、ルートからの絶対パスで辿りたいのですが、方法を教えて下さいますでしょうか。 宜しくお願いします。

    • ベストアンサー
    • XML
  • Delphiでサブクエリは可能か

    Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。

  • Access97のクエリー(sql文)について

    [A]テーブルに[CODE.DATE.CHK]とフィールドがあります 内容は、 [CODE][DATE][CHK] 01.2007/06/01.0 01.2007/06/10.1 01.2007/06/11.1 02.2007/05/01.0 02.2007/05/10.1 と、します。 結果を 01.3.2 02.2.1  と、したいのです。 つまり、[DATE]の行数と、[CHK]が1の件数が とりたいのです。 SELECT A.CODE, Count(A.DATE) AS CNT FROM A GROUP BY A.CODE; と、すれば、[DATE]の行数はとれます。 [CHK]が1の件数の取り方が解りません。 宜しくお願い致します。

  • HTML+PHPのリストボックス表示について

    現在HTML+PHPで勉強しながらアプリを作成しています。 MySQLからデータをよみ、その値からリストボックスを作成し表示させていますが、そのリストボックスがテーブル内に表示されず、位置がずれて表示されます。どうすればうまくテーブル内に表示されるのか教えてください。よろしくお願いします。(PHPというよりHTMLの質問かもしれませんが) <?php //データベース接続設定 $dbtype="mysql"; $sv="localhost"; $dbname="hogehoge"; $user="root"; $pass="abcdefg"; //データベースに接続 $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn,$user,$pass); //---------------------------------------- // ■ POST時 //---------------------------------------- if ($_SERVER["REQUEST_METHOD"]=="POST"){ // □ 新規追加 if (isset($_POST["submit_add"])){ $new_code = htmlspecialchars($_POST["new_code"], ENT_QUOTES); //追加コード $new_kbncod = htmlspecialchars($_POST["new_kbncod"], ENT_QUOTES); //追加項目 $sql = "INSERT INTO kekka VALUES(null,'$new_code','$new_kbncod')"; $stmt = $conn->prepare($sql); $stmt->execute(); } // □ 変更 if (isset($_POST["submit_upd"])){ $id = key($_POST["submit_upd"]); //押下したボタン番号を取得 //-------------------------------- // □ POSTされたデータを取得 //-------------------------------- $upd_kbncod = htmlspecialchars($_POST["kbn_code"][$id], ENT_QUOTES); //変更項目 $upd_code = htmlspecialchars($_POST["code"][$id], ENT_QUOTES); //変更コード $sql = "UPDATE kekka SET code = $upd_code, kbn_code = $upd_kbncod WHERE id=$id"; $stmt = $conn->prepare($sql); $stmt->execute(); } // □ 削除 if (isset($_POST["submit_del"])){ $id = key($_POST["submit_del"]); //押下したボタン番号を取得 //テーブルからデータを削除 $sql = "DELETE FROM kekka WHERE (id = $id)"; $stmt = $conn->prepare($sql); $stmt->execute(); } } //===================================================================== // ■ H T M L //===================================================================== ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>テスト</title> </head> <body> <h1>テスト中</h1> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> <table border="1" cellspacing="0" cellpadding="3" width="100%" bordercolor="#666666"> <tr bgcolor="#eee8aa"> <td align="center"><font size="2">項目名(リスト)</font></td> <td align="center"><font size="2">コード:数字4桁</font></td> <td align="center"><font size="2">ボタン</font></td> </tr> <?php //---------------------------------------- // □:テーブルからデータを読む //---------------------------------------- $sql = "SELECT * FROM kekka ORDER BY id"; $stmt = $conn->prepare($sql); $stmt->execute(); while($row = $stmt->fetch()){ $id = $row["id"]; $code = $row["code"]; $kbncod = $row["kbn_code"]; echo "<td>".disp_list($conn,"code_hyo", "KBN_CODE", "KBN_NAME", $kbncod, "kbn_code[$id]")."</td>"; echo "<td><input type=text name=code[$id] value=$code size=10></td>"; echo "<td><input type=submit name=submit_upd[$id] value='変更' size=4>"; echo "<input type=submit name=submit_del[$id] value='削除' size=4></td>"; echo "</tr>"; } //追加リスト表示用に、変数の初期化を行う。(ゴミデータ除去) $kbncod=""; $code=""; $new_kbncod=""; $new_code=""; ?> <tr> <td><?php echo disp_list($conn,"code_hyo", "KBN_CODE", "KBN_NAME", $new_kbncod, "new_kbncod"); ?></td> <td><input type="text" name="new_code" value="<?=$new_code ?>" size="15"></td> <td><input type="submit" name="submit_add" value="追加" size="4"></td> </tr> </table> </form> </body> </html> <?php // パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名称 function disp_list( $conn2,$table, $value, $text,$selected_value, $m_name) { // DBから項目情報を取り出す $sql2 = "SELECT * FROM " . $table . " ORDER BY " . $value; $stmt2 = $conn2->prepare($sql2); $stmt2->execute(); // 取り出した項目情報をプルダウンリストに表示する echo "<select name=\"" . $m_name . "\">"; while ($row2 = $stmt2->fetch()){ echo "<option "; if ($selected_value == $row2[$value]) { echo " selected "; } echo " value=\"".$row2[$value]."\">"; echo $row2[$text]."</option>"; } echo "</select>"; } ?>

    • ベストアンサー
    • PHP
  • index.php から外部関数に飛び、文字列を返してきてindex.

    index.php から外部関数に飛び、文字列を返してきてindex.phpで XML形式で表示するプログラムはどのように書けばいいんでしょうか? /* ---func1.php--- */ function func1($aa,$bb){ $xml_code = "<func1>\n"; $xml_code .= "<aaa>".$aaa."</aaa>\n"; $xml_code .= "<bbb>".$bbb."</bbb>\n"; $xml_code .= "</func1>\n"; return ($xml_code); } /* ---func2.php--- */ function func2($cc,$dd){ //DBからデータを取得して $sql = "SELECT ccc, ddd, eee, tel FROM tbl_a WHERE id = ".$id; $moji_db = ""; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)){ $xml_code = "<func2>\n"; $xml_code .= "<ccc>".$row['ccc']."</ccc>\n"; $xml_code .= "<ddd>".$row['ddd']."</ddd>\n"; $xml_code .= "<eee>".$row['eee']."</eee>\n"; $xml_code .= "</func2>\n"; } return ($xml_code); } index.php で 両方の$xml_codeを出力する 以上のようなプログラムなんですけど、 index.phpでのxmlでの表示の仕方がわかりません。 /* ---index.php--- */ <?php // require func1.phpとfunc2.php function xml_make(&$xml ){ // DB 接続 // XML Header生成 echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"."\n"; echo func1(); echo func2(); // XML Footer生成 // DB 切断 } ?> としてindex.phpを実行するとIEで以下のエラーが出ます。 (firefoxではでません。両ブラウザ共、ソースを表示するとXML形式にはなっていますが・・) 「XML ページを表示できません XSL スタイル シートを使用した XML 入力は表示できません。 エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。 -------------------------------------------------------------------------------- XML ドキュメント内では最上位の要素に限り、使用できます。 」 それと文字列($xml_code)をSimpleXMLで処理するにはどうしたらいいのでしょう?

    • ベストアンサー
    • PHP

専門家に質問してみよう