gpt4 book ai didi

c# - 如何使用 C# 查询这两个 XML 文件?

转载 作者:太空狗 更新时间:2023-10-29 23:48:27 25 4
gpt4 key购买 nike

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

这是我的访问数据库中的图表。

alt text

然后我创建了两个 XML 文件,其结构与两个访问表的结构相同。

联系人列表

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

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

我的简单应用应该是这样的:

alt text

在我原来的应用程序中,我使用 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;
}
}
}

最佳答案

这是我的解决方案(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);
}
}
}
}

输出

Result

将必要的属性添加到 gridViews

我在设计时创建了

而不是 foreach 我们可以使用 LAMBDA 表达式希望您能理解....如果您有任何问题,请告诉我。

享受吧!!!!

关于c# - 如何使用 C# 查询这两个 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com