2016-08-15 95 views
0

我有两个xml代码,显示来自两个独立表的数据,现在我想在c#中读取它们并显示它们的连接数据 我试过这一个,但它只适用于一个表。在c#datagridview中显示两个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代码,我不知道我是否应该在这里写太多或没有。 现在我应该如何改变上面的C#代码工作两个或多个表? 非常感谢我的英语。

+0

一般读取复杂的XML成数据集产生一个锯齿形阵列是不容易的加入。在这些情况下编写自己的代码将xml解析到单个数据表中会更好。在这些情况下,我通常使用xml linq。我需要看到XML来编写代码。 – jdweng

+0

当DataSet读取XML文件时,根标记是数据集的名称。第一个子标签是表格的名称。下一级别标签是表格的列名称。最后一个级别的标签是实际的数据。当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) 
      { 
      } 
     } 
    } 
} 

这里是一个动态的解决方案

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

什么是动态?我想确保我正确理解你。两张桌子之间常见的关键是什么? – jdweng

+0

我的意思是xml文件可能每次都会改变,所以我无法将它们定义为静态字符串。我认为应该有一种方法可以从网页中读取它们并在我的程序中使用它,或者可以通过我的网页的xml输出来改变字符串的值。 – rozeta

相关问题