1

XMLから要素を取得するのに問題があります。XMLからVehiclesまたはVehicle要素を取得できません。常にnullを返します。

誰かが私がどこで間違っているのか見ることができますか?

これが私のコードです...

    [TestMethod]
    public void TestDeleteVehicleFromXMLFile()
    {
        using (FileStream stream = new FileStream(base._TestXPathXMLFile, FileMode.Open))
        {
            try
            {
                XDocument xDoc = XDocument.Load(stream);
                var q = from RootNode in xDoc.Descendants("VehicleCache")

                    select new
                    {
                        // Vehicles & VehiclesList is always null
                        Vehicles = RootNode.Elements(XName.Get("Vehicle")).ToList(),
                        VehiclesList = RootNode.Elements(XName.Get("Vehicles")).ToList(),
                        SelfNode = RootNode.DescendantNodesAndSelf().ToList(),
                        DescendantNodes = RootNode.DescendantNodes().ToList()
                    };

                // used to see what is in item
                foreach (var item in q)
                {
                    int i = 0;
                }
            }
            catch(Exception E)
            {
                Assert.Fail(E.Message);
            }
        }
    }


<VehicleCache>
<Vehicles xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.myURL.co.uk">
    <Vehicle>
      <CapCode>41653</CapCode>
      <TrueCap i:nil="true" />
      <VehicleID>365789</VehicleID>
      <ViperVehicleID i:nil="true" />
      <BodyTypeID>5</BodyTypeID>
    </Vehicle>
    <Vehicle>
      <CapCode>42565</CapCode>
      <TrueCap i:nil="true" />
      <VehicleID>365845</VehicleID>
      <ViperVehicleID i:nil="true" />
      <BodyTypeID>2</BodyTypeID>
    </Vehicle>
</Vehicles>

4

2 に答える 2

9

XNamespaceを定義する

XNamespace ns = "http://www.myURL.co.uk";

それを使用してください:

Vehicles = RootNode.Elements(XName.Get(ns + "Vehicle")).ToList(),

または、名前空間の使用を避けたい場合は、次のことを試してください。

var result = xDoc.Descendants().Where(r => r.Name.LocalName == "VehicleCache");
于 2012-08-09T09:50:35.963 に答える
3

名前空間を含める必要があります。

XNamespace Snmp = "http://www.myURL.co.uk";

ルートの子孫の場合も、名前空間を含める必要があります。

var q = from RootNode in xDoc.Descendants(Snmp +"VehicleCache")

このような

Vehicles = RootNode.Elements(XName.Get(Snmp + "Vehicle")).ToList()//snmp is the namespace
于 2012-08-09T09:49:23.200 に答える