【问题标题】:LINQ to XML with multiple namespaces具有多个命名空间的 LINQ to XML
【发布时间】:2014-02-07 18:21:56
【问题描述】:

我希望你能帮忙:-) 我一直在尝试使用 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; }

我希望你们中的一个聪明人能给我提供一个关于如何获得这些值的例子,或者解释为什么我对这些值的追求失败了 :-)

【问题讨论】:

    标签: c# xml linq namespaces


    【解决方案1】:

    您的查询表达式声明了一个名为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 }
    

    【讨论】:

    • 这行得通!如果我要制作一类汽车然后做类似的事情,我能问我如何让它工作:var Cars = from car in xml.Descendants(ns + "Cars") select new Parts { Extras = (from extraElement in Parts.Descendants(ns3 + "Gauges").Select(x => new { // 你会在这里使用 new Gauge Speed = (double?) x.Element(ns3 + "Speed") ?? 0.0, Rpm = (int?) x.Element(ns3 + "Rpm") ?? 0 }); 我似乎无法让它工作?
    • 对不起,此评论中的代码。我是新来这里发帖的,所以我不能 100% 确定该怎么做? :-) 顺便感谢您到目前为止的帮助! :-)
    • @Sasquatch:“我似乎无法让它发挥作用”并没有说太多。这听起来像是一个不同的问题,因此您应该提出一个新问题,说明到目前为止您已经走了多远以及发生了什么。
    • 没错,我会问一个新问题:-)
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多