2016-08-15 11 views
0

私は2つの別々のテーブルのデータを表示する2つのxmlコードを持っていますが、今度は両方をc#で読み込み、それらのデータを表示したい これを試しましたが、c#datagridviewに2つのxmlコードのデータを表示しますか?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/ShowUsers.php"); 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      StreamReader input = new StreamReader(response.GetResponseStream()); 
      ds.ReadXml(input); 
try 
      { 
       int varTotCol = ds.Tables[0].Columns.Count, varTotRow = ds.Tables[0].Rows.Count; 
       frm.dgv_ShowUsers.DataSource = ds.Tables["users"]; 
      } 
      catch (Exception Except) 
      { 
       MessageBox.Show(Except.ToString()); 
      } 

そして、これらは私のxmlコードです:

//first one 
<users> 
<ID>1</ID> 
<user_login>admin</user_login> 
<user_pass>$P$Bdfdffddkjlkiyuyadnvjd</user_pass> 
<term_id>2</term_id> 
<user_activation_key></user_activation_key> 
<user_status>0</user_status> 
<display_name>admin</display_name> 
<users> 

//second one 
<terms> 
<term_id>2</term_id> 
<name>name</name> 
<term_group>0</term_group> 
</terms> 

私はあまりにもかないここにそれを書く必要がある場合、私は知らない、PHPを経由して、このXMLコードに自分のデータベースを変換しました。 ここで、2つ以上のテーブルで上記のC#コードをどのように変更する必要がありますか? あらかじめありがとうございました。私の英語には申し訳ありません。

+0

で参加することは容易ではないジャグ配列を生成してみます。これらのケースでは、xmlを単一のデータテーブルに解析する独自のコードを記述することをお勧めします。私は通常これらの場合にxml linqを使用します。私はコードを書くためにxmlを見る必要があります。 – jdweng

+0

XMLファイルがDataSetによって読み取られる場合、ルートタグはデータセットの名前です。 1番目の子タグはテーブルの名前です。次のレベルのタグは、テーブルの列名です。最終的に次のレベルのタグが実際のデータです。 xmlのネストされたタグのレベルが増えると、追加のデータテーブルが作成されますが、追加テーブルの主キーが整理されていないため、テーブルを結合することができません。 – jdweng

+0

@jdwengあなたの答えをありがとう、私はまた、XMLコードを含む私の投稿を編集しました。 – rozeta

答えて

0

は、ここでは、この

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Data; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml1 = 
       "<root>" + 
       "<users>" + 
        "<ID>1</ID>" + 
        "<user_login>admin</user_login>" + 
        "<user_pass>$P$Bdfdffddkjlkiyuyadnvjd</user_pass>" + 
        "<term_id>2</term_id>" + 
        "<user_activation_key></user_activation_key>" + 
        "<user_status>0</user_status>" + 
        "<display_name>admin</display_name>" + 
       "</users>" + 
       "</root>"; 

      XElement users = XElement.Parse(xml1); 

      string xml2 = 
       "<root>" + 
       "<terms>" + 
        "<term_id>2</term_id>" + 
        "<name>name</name>" + 
        "<term_group>0</term_group>" + 
       "</terms>" + 
       "</root>"; 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("ID", typeof(int)); 
      dt.Columns.Add("Login", typeof(string)); 
      dt.Columns.Add("Password", typeof(string)); 
      dt.Columns.Add("TermID", typeof(int)); 
      dt.Columns.Add("Key", typeof(string)); 
      dt.Columns.Add("Status", typeof(int)); 
      dt.Columns.Add("DisplayName", typeof(string)); 
      dt.Columns.Add("Name", typeof(string)); 
      dt.Columns.Add("Group", typeof(int)); 

      XElement terms = XElement.Parse(xml2); 
      try 
      { 

       var groups = from user in users.Elements("users") 
          join term in terms.Elements("terms") 
          on (int)user.Element("term_id") equals (int)term.Element("term_id") 
          select new { user = user, term = term }; 

       foreach (var group in groups) 
       { 

        dt.Rows.Add(new object[] { 
         (int)group.user.Element("ID"), 
         (string)group.user.Element("user_login"), 
         (string)group.user.Element("user_pass"), 
         (int)group.user.Element("term_id"), 
         (string)group.user.Element("user_activation_key"), 
         (int)group.user.Element("user_status"), 
         (string)group.user.Element("display_name"), 
         (string)group.term.Element("Name"), 
         (int)group.term.Element("term_group") 
        }); 

       } 
       frm.dgv_ShowUsers.DataSource = dt; 

      } 
      catch (Exception e) 
      { 
      } 
     } 
    } 
} 

は、通常のデータセットへの複雑なXMLを読みダイナミックソリューション

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Data; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml1Str = 
       "<root>" + 
       "<users>" + 
        "<ID>1</ID>" + 
        "<user_login>admin</user_login>" + 
        "<user_pass>$P$Bdfdffddkjlkiyuyadnvjd</user_pass>" + 
        "<term_id>2</term_id>" + 
        "<user_activation_key></user_activation_key>" + 
        "<user_status>0</user_status>" + 
        "<display_name>admin</display_name>" + 
       "</users>" + 
       "</root>"; 

      XElement xml1 = XElement.Parse(xml1Str); 
      XElement xml1FirstNode = (XElement)xml1.FirstNode; 
      string[] xml1ColNames = xml1FirstNode.Elements().Select(x => x.Name.LocalName).ToArray(); 

      string xml2Str = 
       "<root>" + 
       "<terms>" + 
        "<term_id>2</term_id>" + 
        "<name>name</name>" + 
        "<term_group>0</term_group>" + 
       "</terms>" + 
       "</root>"; 

      XElement xml2 = XElement.Parse(xml2Str); 
      XElement xml2FirstNode = (XElement)xml2.FirstNode; 
      string[] xml2ColNames = xml2FirstNode.Elements().Select(x => x.Name.LocalName).ToArray(); 


      DataTable dt = new DataTable(); 
      string[] colNames = xml1ColNames.Union(xml2ColNames).ToArray(); 
      foreach (var colName in colNames) 
      { 
       dt.Columns.Add(colName, typeof(string)); 
      } 

      try 
      { 

       var groups = from x1 in xml1.Elements() 
          join x2 in xml2.Elements() 
          on (string)x1.Element("term_id") equals (string)x2.Element("term_id") 
          select new { x1 = x1, x2 = x2 }; 

       foreach (var group in groups) 
       { 
        DataRow newRow = dt.Rows.Add(); 
        foreach (var x1Value in group.x1.Elements()) 
        { 
         newRow[x1Value.Name.LocalName] = (string)x1Value; 
        } 
        foreach (var x2Value in group.x2.Elements()) 
        { 
         newRow[x2Value.Name.LocalName] = (string)x2Value; 
        } 

       } 
       frm.dgv_ShowUsers.DataSource = dt; 
      } 
      catch (Exception e) 
      { 
      } 
     } 
    } 
} 
+0

これ自体は機能しますが、ウェブページからXMLを読み込みたい場合は、毎回変更されるため、静的にすることはできません。私が正しく理解していれば、これは静的です。私は動的なもののために何をすべきですか? – rozeta

+0

動的とは何ですか?私はあなたが正しくあなたを理解していることを確認したい。また、2つのテーブル間で共通のキーは何ですか? – jdweng

+0

私は静的な文字列として定義することはできませんので、xmlファイルが毎回変更されることを意味します。私は、ウェブページからそれらを読んで、自分のプログラムで使用する方法や、私のウェブページのXML出力に文字列ベースの値を変更する方法があるはずだと思います。 – rozeta

関連する問題