具有多个名称空间的LINQ to XML

时间:2014-01-18 09:54:44

标签: c# xml linq namespaces

我希望你能帮忙:-) 我一直试图使用LINQ来读取C#中的XML文件。

这是XML结构:

<DataBase
xsi:schemaLocation="http://somestuff.new/xml http://somestuff.xsd"
xmlns:ns5="http://somestuff.new/ns5"
xmlns:ns3="http://somestuff.new/ns3"
xmlns:ns2="http://somestuff.new/ns2"
xmlns="http://somestuff.new/ns"
xmlns:xsi="http://somestuff.new/XMLScema-instance"
xmlns:ns4="http://somestuff.new/ns4">
    <Cars>
         <SmallCars attribute="Something">
         <Id>licenceplate</Id>
             <Parts attribute="All Parts">
                <Extras>
                   <Gauges xmlns="http://somestuff.new/ns32>
                      <Speed>100</Speed>
                      <Rpm>3200</Rpm>
                   </Gauges>
                </Extras>
             </Parts>
         </SmallCars>
    </Cars>
</DataBase>

我想使用LINQ从Speed和RPM读取值,但我尝试的所有内容似乎都失败了......

这是我的一次尝试:

XNamespace ns3 = XNamespace.Get("http://somestuff.new/ns3");
from gaugeElement in extentionElement.Descendants(ns3 + "Gauges")
select new Gauge
{
Speed = tpxElement.Element(ns3 + "Speed") != null ? Convert.ToDouble(tpxElement.Element(ns3 + "Speed").Value) : 0.00,
Rpm = tpxElement.Element(ns3 + "Rpm") != null ? Convert.ToInt32(tpxElement.Element(ns3 + "Rpm").Value) : 0
}

我正在使用具有属性的Gauge类:

public int Speed { get; set; }
public int Rpm { get; set; }

我希望你们中的一个聪明的人可以为我提供一个如何获得这些价值的例子,或解释为什么我对这些价值观的追求失败: - )

1 个答案:

答案 0 :(得分:3)

您的查询表达式声明了一个名为gaugeElement的范围变量,但您在代码中使用了tpxElement。我还会使用XElement提供的转换来使您的代码更易于阅读 - 我个人甚至不会使用查询表达式:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        var doc = XDocument.Load("test.xml");
        XNamespace ns = "http://somestuff.new/ns3";
        var gauges = doc
            .Descendants(ns + "Gauges")
            .Select(x => new { // You'd use new Gauge here
                Speed = (double?) x.Element(ns + "Speed") ?? 0.0,
                Rpm = (int?) x.Element(ns + "Rpm") ?? 0
            });
        foreach (var gauge in gauges)
        {
            Console.WriteLine(gauge);
        }
    }
}

输出(修复XML之后):

{ Speed = 100, Rpm = 3200 }