从XML获取重复的Id值

时间:2013-07-11 16:50:36

标签: c#-4.0 linq-to-xml

我正在尝试从XML文档中获取列表。我需要从两个不同的部分创建两个列表,然后匹配文档中的Id值。 这是我的XML文件

 <?xml version="1.0" encoding="utf-8"?>
<Root>
    <VehicleCollection>
        <ModelInfo>
            <Vehicle>
                <Id>101</Id>
                <Color>Red</Color>
                <Year>1987</Year>
                <Make>Saturn</Make>
                <Manufacturer>General Motors</Manufacturer>
            </Vehicle>
            <Vehicle>
                <Id>100</Id>
                <Color>Blue</Color>
                <Year>1998</Year>
                <Make>Saturn</Make>
                <Manufacturer>General Motors</Manufacturer>
            </Vehicle>
        </ModelInfo>
        <PriceInfo>
            <Vehicle>
                <Id>101</Id>
                <OriginalCost>11000</OriginalCost>
                <MarketValue>1200</MarketValue>
            </Vehicle>
            <Vehicle>
                <Id>100</Id>
                <OriginalCost>11000</OriginalCost>
                <MarketValue>3100</MarketValue>
            </Vehicle>
        </PriceInfo>
    </VehicleCollection>
</Root>

我想确定PriceInfo部分中的项目数与ModelInfo部分中的项目数相匹配。我正在使用下面的代码来获取列表。

  private static void PrintVehicleInfo(string fileName)
    {
        if (fileName != null)
        {
            var xDoc = XDocument.Load(fileName);
            var vehicle = xDoc.Descendants("Vehicle").ToList(); //Culprit
            foreach (var v in vehicle)
            {
                Console.WriteLine(v.Element("Id"));
            }
        }
    }

如何从XMl文档创建两个单独的列表?我得到一个重复ID值的列表。如果我尝试在代码中包含节名称,则会抛出运行时异常。

 var vehicle = xDoc.Descendants("ModelInfo/Vehicle").ToList();
OR
 var vehicle = xDoc.Descendants("ModelInfo//Vehicle").ToList();

1 个答案:

答案 0 :(得分:0)

多一点挖掘让我找到了解决方案。

var xDoc = XDocument.Load(fileName);
            XElement vehicleCollection = xDoc.Element("Root").Element("VehicleCollection").Element("ModelInfo");
            var vehicle = vehicleCollection.Descendants("Vehicle").ToList();
            foreach (var v in vehicle)
            {
                Console.WriteLine(v.Element("Id"));
            }
            vehicleCollection = xDoc.Element("Root").Element("VehicleCollection").Element("PriceInfo");
            vehicle = vehicleCollection.Descendants("Vehicle").ToList();
            foreach (var v in vehicle)
            {
                Console.WriteLine(v.Element("Id"));
            }