2010-10-13 12 views
5

Küçük bir uygulama (bir telefon rehberi) oluşturuyorum, aslında Ben zaten bir veritabanı olarak ms access kullanarak oluşturdum, ama şimdi, ben XML öğreniyorum ve bu uygulama için bir veritabanı olarak kullanmayı planlıyorum (sadece eğlence için) ve eğitim amaçlı).C# kullanarak bu iki XML dosyası nasıl sorgulanır?

Erişim veritabanımdaki şema İşte.

alt text

Ve iki erişim tablolar için aynı yapıya sahip iki XML dosyalarını yarattı.

contactlist Tablo

<?xml version="1.0" standalone="yes"?> 
<ContactList> 
    <xs:schema id="ContactList" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="ContactList" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="Contact"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="ContactID" type="xs:int" minOccurs="0" /> 
       <xs:element name="Name" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <Contact> 
    <ContactID>1</ContactID> 
    <Name>Peter</Name> 
    </Contact> 
    <Contact> 
    <ContactID>2</ContactID> 
    <Name>John</Name> 
    </Contact> 
</ContactList> 

ContactNumbers Tablo

<?xml version="1.0" standalone="yes"?> 
<ContactNumbers> 
    <xs:schema id="ContactNumbers" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="ContactNumbers" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="Numbers"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="ContactID" type="xs:int" minOccurs="0" /> 
       <xs:element name="Mobile" type="xs:string" minOccurs="0" /> 
       <xs:element name="Office" type="xs:string" minOccurs="0" /> 
       <xs:element name="Home" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <Numbers> 
    <ContactID>1</ContactID> 
    <Mobile>+63-9277-392607</Mobile> 
    <Office>02-890-2345</Office> 
    <Home>0</Home> 
    </Numbers> 
    <Numbers> 
    <ContactID>2</ContactID> 
    <Mobile>+62-9277-392607</Mobile> 
    <Office>02-890-2345</Office> 
    <Home>1</Home> 
    </Numbers> 
</ContactNumbers> 

Bu benim basit bir uygulama gibi görünmelidir nasıl:

alt text

Orijinal uygulamasında, belirli bir kişinin iletişim numaralarını almak için INNER JOIN deyimini kullandım. Ancak şimdi, 2 xml dosyasını tablo olarak kullanıyorum (iki ms erişim tablosuna karşılık gelir). Bu iki XML dosyasını sorgulamak ve bağlamak ve ilk uygulamam (erişim kullanarak) sürümüyle aynı işlevselliği elde etmek hala mümkün mü? Ben şahsen böyle devam DataViewManager DataTable ve çalışmak için sevmiyorum

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace TestXML 
{ 
    public partial class Form1 : Form 
    { 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
     DataSet ds = new DataSet(); 
     DataView dv = new DataView(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnBrowse_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       openFileDialog1.Filter = "XML Document (*.xml)|*.xml"; 
       openFileDialog1.FileName = ""; 
       openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
       if (openFileDialog1.ShowDialog() == DialogResult.OK) 
       { 
        txtDirectory.Text = openFileDialog1.FileName;      
        btnLoad.Enabled = true; 
       } 
      } 
      catch (Exception x) 
      { 
       btnLoad.Enabled = false; 
       MessageBox.Show("Something went wrong! \n" + x.Message, "Ooops!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
      } 
     } 

     private void btnLoad_Click(object sender, EventArgs e) 
     { 
      dgContactList.DataSource = LoadXML(); 
     } 

     private DataView LoadXML() 
     { 
      try 
      { 
       ds.Clear(); 
       ds.ReadXml(txtDirectory.Text, XmlReadMode.ReadSchema); 
       dv = ds.Tables[0].DefaultView; 
       lblStatus.Text = "XML is loaded successfully"; 
      } 
      catch (Exception x) 
      { 
       MessageBox.Show("Something went wrong! \n" + x.Message, "Ooops!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       lblStatus.Text = ""; 
      } 
      return dv; 
     } 
    } 
} 

cevap

1

İşte benim çözüm (MainList sizin 1st XML ve DetailedList saniyedir.)

using System; 
using System.Linq; 
using System.Windows.Forms; 
using System.Xml.Linq; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog OpenFD = new OpenFileDialog(); 
      OpenFD.InitialDirectory = Application.StartupPath; 
      OpenFD.FileName = ""; 
      OpenFD.ShowDialog(); 
      if (OpenFD.FileName == "") 
       return; 
      textBox1.Text = OpenFD.FileName; 
      ReadXMLFile(OpenFD.FileName); 
     } 
     private void ReadXMLFile(String strFileName) 
     { 
      var X = XDocument.Load(strFileName).Descendants("Contact").Select(N => new 
     { 
      ID = N.Element("ContactID").Value, 
      Name=N.Element("Name").Value 
     }); 
     foreach (var XX in X) 
     { 
      dataGridView1.Rows.Add(XX.ID, XX.Name); 
     } 
    } 


    private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     String St = dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); 
     var Data = XDocument.Load(Application.StartupPath + "\\DetailedList.xml").Descendants("Numbers") 
         .Where(X=>X.Element("ContactID").Value ==St) 
         .Select(N => new 
          { 
           Mobile = N.Element("Mobile").Value, 
           Office = N.Element("Office").Value, 
           Home = N.Element("Home").Value 
          }); 
     dataGridView2.Rows.Clear(); 
     foreach (var X in Data) 
     { 
      dataGridView2.Rows.Add(X.Mobile,X.Office,X.Home); 
     } 
    } 
} 
} 

Çıktı

Result

ben tasarım zamanında columns oluşturduk hem gridViews

gerekli özellik ekleyin.

Ve Yerine foreach biz LAMBDA Expression anlayacaksın Umut wse olabilir .... herhangi isses varsa bana bildirin.

Keyfini çıkarın !!!!!

+0

Wow! hehe, cevabınız için çok teşekkür ederim efendim :). Birinin cevap yazdığından çok memnunum ve işe yarıyor. Her ne kadar özellikle benim gibi acemi bu kadar kolay değil, acemi. Ama ben daha fazla okuma ve kodunuzla etrafta oynayacağım, tek istediğim, çalışmam için bir örnek vermek ve daha az gelişmiş bir uygulama ve kodlama yapmak için bir temel olarak hizmet etmek. Tekrar teşekkürler :) – yonan2236

+0

Ben LAMDA İfade 'zar zor anlamak – yonan2236

0

:

Şimdilik

, bu sadece ne var. XML verilerinize karşılık gelen sınıflar oluşturdum. Örneğin. İletişim ve Sayılar. Sonra XML LINQ sözdizimi ile XDocument kullanarak verileri okuyacağım. İlk GridView'de ayarlayacağınız bir kişi koleksiyonu oluşturursunuz ve tıkladıktan sonra sadece seçili nesneyi koleksiyondan okuyup verileri ikinci GridView'de ayarlayınız.

İç birleşmelere gerek yoktur, her şey sınıflarda tanımlanır ve açıkça daha iyi okunabilir. Sadece bir fikir.

DÜZENLEME:

Bilgiler Daha:

örneğin veri, temsil sınıflar oluşturun Kontak, Sayılar

XDocument adresinden MSDN'de okuyun.

Örnek:

XDocument contactDoc = XDocument.Load(m_helpTopicFile); 
var contacts = from xmlTopic in contactDoc.Descendants("Contact") 
select new Contact 
        { 
         Id = int.Parse(xmlTopic.Element("ContactID").Value, CultureInfo.InvariantCulture), 
         Name = xmlTopic.Element("name").Value, 

        }; 

Sonra contacts.ToList kullanarak veri kaynağı bu set()

+0

sadece yeni başlayanlar ... Ne dediğiniz hakkında hiçbir fikrim yok .. – yonan2236

+0

Cevabımı düzenledim, umarım bu yardımcı olur – testalino

İlgili konular