按参数 c# 筛选我的 XML
本文关键字:我的 XML 筛选 参数 | 更新日期: 2023-09-27 18:33:10
我对通过 c# 在我的 XML 文件中搜索/过滤有疑问
我有一个大的XML文件,其中包含我国的不同学校:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<school>
<schoolnummer>3699</schoolnummer>
<vestigingsnummer>1</vestigingsnummer>
<net>Vrij gesubsidieerd onderwijs</net>
<naam>Vrije Basisschool - Sint-Joris</naam>
<hoofdzetel>J</hoofdzetel>
<straat>Cellebroersstraat</straat>
<huisnummer>16</huisnummer>
<postcode>1000</postcode>
<gemeente>BRUSSEL</gemeente>
<crabcode>19636</crabcode>
<crabhuisnr>16</crabhuisnr>
<crabbusnr> </crabbusnr>
<telefoon>0471-76.32.05</telefoon>
<email>pdedonder@sintjorisbasisschool.be</email>
<url>www.sintjorisbasisschool.be</url>
<familienaambeheerder>DE DONDER</familienaambeheerder>
<voornaambeheerder>Peter</voornaambeheerder>
</school>
<school>
<schoolnummer>3889</schoolnummer>
<vestigingsnummer>1</vestigingsnummer>
<net>Vrij gesubsidieerd onderwijs</net>
<naam>Vrije Basisschool</naam>
<hoofdzetel>J</hoofdzetel>
<straat>John Waterloo Wilsonstraat</straat>
<huisnummer>21</huisnummer>
<postcode>1000</postcode>
<gemeente>BRUSSEL</gemeente>
<crabcode>19972</crabcode>
<crabhuisnr>21</crabhuisnr>
<crabbusnr> </crabbusnr>
<telefoon>02-230.75.28</telefoon>
<fax>02-230.48.44</fax>
<email>abeullens@tennude.be</email>
<url>www.tennude.be</url>
<familienaambeheerder>BEULLENS</familienaambeheerder>
<voornaambeheerder>Ann</voornaambeheerder>
</school>
对于我的项目,我需要通过搜索正确的<postcode>
来找到所有<School>
,例如"1000"。
最好的方法是什么?XMLReader/LINQ to XML?注意:这是一个非常大的 XML 文件。
我是 LINQ to XML 的忠实粉丝,但对于像您这样结构强、类似表的 XML 数据,我总是推荐XmlSerializer
。它是比XDocument和XElement更专业,更高级的数据表示形式。
您可以定义一个名为 School
的 C# 类,用 [XmlRoot("school")]
标记它,为每个 XML 字段定义 C# 属性(即 public int schoolnummer { get; set; }
等)并使用 XmlSerializer.Deserialize()
填充School
对象。它通过 XML 中的元素名称自动查找 C# 属性(区分大小写!
如果您的 XML 文件太大而无法同时将所有内容保存在 RAM 中,则必须找到一种方法来反序列化对象并在您仍在搜索时将它们丢弃。
我这里有一个示例,可能会对您有所帮助。几个月前我对其进行了编程,并将XmlTextReader
与XmlSerializer
相结合,从users.xml
中逐个读取TestUser
对象并将它们添加到列表中。不完全是你想做的,但你可以调整它以满足你的需求:
private void _LoadUsers()
{
_users = new List<TestUser>();
string path = Path.Combine(_projectNamespace, "users.xml");
var stream = new FileStream(path, FileMode.Open);
var reader = new XmlTextReader(new StreamReader(stream));
while (reader.ReadToFollowing("user"))
{
var serializer = new XmlSerializer(typeof(TestUser));
_users.Add((TestUser)serializer.Deserialize(reader.ReadSubtree()));
}
stream.Close();
}