我正在创建一个小应用程序(电话簿),实际上我已经使用ms访问作为数据库创建了它,但现在,我正在学习XML并计划将其用作此应用程序的数据库(仅用于娱乐和教育目的) ).
这是我的访问数据库中的图表.

我创建了两个XML文件,其结构与两个访问表的结构相同.
ContactList表
<?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>
Run Code Online (Sandbox Code Playgroud)
ContactNumbers表
<?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>
Run Code Online (Sandbox Code Playgroud)
这就是我的简单应用程序的样子:

在我的原始应用程序中,我使用INNER JOIN语句来检索特定联系人的联系号码.但是现在,我不知道怎么做,因为我使用2个XML文件作为表(对应于两个ms访问表).是否仍然可以查询和链接这两个XML文件,并实现与我的第一个应用程序(使用访问)版本相同的功能?
现在,这是我唯一拥有的:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案(MainList是您的第一个 XML,DetailedList是第二个。)
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出

将必要的属性添加到gridViews
columns我在设计时创建了。
相反,foreach我们可以希望LAMBDA Expression
您能理解...如果您有任何问题,请告诉我。
享受!!!!!