2014-01-18 3 views
3

Надеюсь, вы сможете помочь :-) Я застрял в попытке использовать LINQ для чтения XML-файла на C#.LINQ to 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, но все, что я стараюсь, похоже, не ...

Это одна из моих попыток:

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; } 

Я надеюсь, что один из вас умные ребята, можете дать мне пример о том, как получить эти ценности или объяснить, почему мои поиски значений не может :-)

ответ

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); 
     } 
    } 
} 

Output (после фиксации вашего XML):

{ Speed = 100, Rpm = 3200 } 
+0

Это работает! Могу ли я спросить, как я мог бы это сделать, если бы я сделал класс автомобилей, а затем сделал что-то вроде: var Cars = от автомобиля в xml. Потомки (ns + «Cars») выбрать новые запчасти { Дополнительно = (из extraElement в Parts.Descendants (ns3 + "Gauges"). Выберите (x => new {// Здесь вы используете новый калибр Speed ​​= (double?) x.Element (ns3 + «Speed»)? ? 0, Rpm = (int?) X.Element (ns3 + "Rpm") 0 }) Возможно, я не могу заставить это работать? – Sasquatch

+0

Извините за код в этом комментарии .. Я новичок в размещении здесь, поэтому я не уверен на 100%, как еще это сделать? :-) И кстати спасибо за вашу помощь до сих пор! :-) – Sasquatch

+0

@Sasquatch: «Кажется, я не могу заставить это работать» на самом деле не так много говорит. Это звучит как другая проблема, поэтому вы должны задать новый вопрос, покажите, насколько далеко вы дошли, и что происходит. –

Смежные вопросы