我对通过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>
对于我的项目,我需要通过搜索右<School>
找到所有<postcode>
,例如'1000'。
最好的方法是什么? XMLReader / LINQ to XML? 注意:这是一个非常大的XML文件。
答案 0 :(得分:1)
我是LINQ to XML的忠实粉丝,但对于像你这样的结构化,类似表格的XML数据,我总是会推荐XmlSerializer
。与XDocument和XElement相比,它是一种更专业,更高级别的数据表示。
您可以定义一个名为School
的C#类,用[XmlRoot("school")]
标记它,为每个XML字段定义C#属性(即public int schoolnummer { get; set; }
等)并填写School
使用XmlSerializer.Deserialize()
的对象。它会自动通过XML中的元素名称找到您的C#属性(区分大小写!)。
如果您的XML文件太大而无法同时将所有内容保存在RAM中,则必须找到一种方法来反序列化对象并在您仍在搜索时丢弃它们。
我这里有一个可以帮助你的样本。几个月前我对它进行了编程,我将XmlTextReader
与XmlSerializer
合并,逐一从TestUser
读取users.xml
个对象,并将它们添加到列表中。不完全是你想做的,但你可以根据自己的需要进行调整:
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();
}