2010-10-13 6 views
5

Je crée une petite application (un répertoire), en fait Je l'ai déjà créé en utilisant l'accès ms comme base de données, mais maintenant, j'apprends le XML et je prévois de l'utiliser comme base de données pour cette application et à des fins éducatives).Comment interroger ces deux fichiers XML en utilisant C#?

Voici le diagramme dans ma base de données d'accès.

alt text

Et je crée deux fichiers XML avec la même structure que les deux tables d'accès.

ContactList Tableau

<?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 Tableau

<?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> 

Voici comment mon application simple devrait ressembler à:

alt text

Dans mon application d'origine, j'ai utilisé l'instruction INNER JOIN pour récupérer les numéros de contact d'un contact particulier. Mais maintenant, je n'ai aucune idée de la façon de le faire puisque j'utilise 2 fichiers XML comme tables (correspondant aux deux tables d'accès ms). Est-il encore possible d'interroger et de lier ces deux fichiers XML et d'obtenir les mêmes fonctionnalités que ma première application (using access)?

Pour l'instant, voici ce que j'ai seulement:

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; 
     } 
    } 
} 

Répondre

1

Voici ma solution (MainList est votre 1er XML et DetailedList est le second.)

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); 
     } 
    } 
} 
} 

Sortie

Result

Ajoutez la propriété nécessaire à la fois la gridViews

J'ai créé le columns au moment de la conception.

Et au lieu de foreach nous pouvons wse LAMBDA Expression Espérons que vous comprendrez .... S'il vous plaît laissez-moi savoir si vous avez des isses.

Profitez-en !!!!!

+0

Wow! hehe, merci beaucoup monsieur pour votre réponse :). Je suis très content que quelqu'un ait posté une réponse, et ça fonctionne. Bien que ce ne soit pas facile à comprendre, surtout pour moi, débutant. Mais je vais faire plus de lecture et jouer avec votre code, tout ce que je veux c'est avoir un exemple pour que je puisse l'étudier et servir de base pour construire une application et un codage plus avancés, petit à petit. Merci encore :) – yonan2236

+0

Je comprends à peine "Expression LAMDA" – yonan2236

0

Je n'aime pas personnellement travailler avec DataView, DataTable et ainsi de suite. Je créerais des classes correspondant à vos données XML. Par exemple. Contact et numéros. Ensuite, je voudrais lire dans les données en utilisant XDocument avec la syntaxe XML LINQ. Vous créez une collection de contacts que vous allez définir sur le premier GridView, et après avoir cliqué sur vous venez de lire l'objet sélectionné dans la collection et de définir les données sur le second GridView.

Pas besoin de jointures internes, tout est défini dans les classes et clairement lisible. Juste une opinion.

EDIT:

Plus d'Infos:

créer des classes qui représentent vos données, par exemple Contact, numéros

En savoir plus sur XDocument sur MSDN.

Exemple:

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, 

        }; 

Réglez ensuite ce que la source de données en utilisant contacts.ToList()

+0

juste un débutant ... Je n'ai aucune idée de ce que vous avez dit..hehe – yonan2236

+0

J'ai édité ma réponse, espérons que cela aide – testalino

Questions connexes