2015-11-09 2 views
-2

Это результат онлайн XML:Получить значения конкретных элементов XML в C# с помощью LINQ

<prices targetNamespace="http://api.saxo.com/v1/prices/"> 
    <price> 
     <id>28924741-0-0-1-0-1-0</id> 
     <quantity type="integer">1</quantity> 
     <normalprice type="decimal">49,95</normalprice> 
     <price type="decimal">49,95</price> 
     <vatpercent type="decimal">25,00</vatpercent> 
     <fixedprice>false</fixedprice> 
     <discount type="decimal">0,00</discount> 
     <allowdiscount type="integer">1</allowdiscount> 
     <productid>28924741</productid> 
     <entries> 
      <entry> 
       <id>1</id> 
       <type type="PriceEntryType">Standard</type> 
       <quantity type="integer">1</quantity> 
       <vatpercent type="decimal">25,00</vatpercent> 
       <vatamount type="decimal">9,99</vatamount> 
       <priceunitexvat type="decimal">39,96</priceunitexvat> 
       <priceunitinclvat type="decimal">49,95</priceunitinclvat> 
       <pricetotalexvat type="decimal">39,96</pricetotalexvat> 
       <pricetotalinclvat type="decimal">49,95</pricetotalinclvat> 
       <discountpercent type="decimal">0,00</discountpercent> 
       <discountamountexvat type="decimal">0,00</discountamountexvat> 
       <discountamountinclvat type="decimal">0,00</discountamountinclvat> 
      </entry> 
      <entry> 
       <id>2</id> 
       <type type="PriceEntryType">Context</type> 
       <quantity type="integer">1</quantity> 
       <vatpercent type="decimal">25,00</vatpercent> 
       <vatamount type="decimal">9,99</vatamount> 
       <priceunitexvat type="decimal">39,96</priceunitexvat> 
       <priceunitinclvat type="decimal">49,95</priceunitinclvat> 
       <pricetotalexvat type="decimal">39,96</pricetotalexvat> 
       <pricetotalinclvat type="decimal">49,95</pricetotalinclvat> 
       <discountpercent type="decimal">0,00</discountpercent> 
       <discountamountexvat type="decimal">0,00</discountamountexvat> 
       <discountamountinclvat type="decimal">0,00</discountamountinclvat> 
      </entry> 
      <entry> 
       <id>3</id> 
       <type type="PriceEntryType">Subscription</type> 
       <quantity type="integer">1</quantity> 
       <vatpercent type="decimal">25,00</vatpercent> 
       <vatamount type="decimal">6,99</vatamount> 
       <priceunitexvat type="decimal">27,96</priceunitexvat> 
       <priceunitinclvat type="decimal">34,95</priceunitinclvat> 
       <pricetotalexvat type="decimal">27,96</pricetotalexvat> 
       <pricetotalinclvat type="decimal">34,95</pricetotalinclvat> 
       <discountpercent type="decimal">30,03</discountpercent> 
       <discountamountexvat type="decimal">12,00</discountamountexvat> 
       <discountamountinclvat type="decimal">15,00</discountamountinclvat> 
      </entry> 
     </entries> 
    </price> 
</prices> 

Я перепробовал много способов, чтобы получить значение «normalprice» и «pricetotalinclvat» последней записи. но я получил null или исключение.

Можете ли вы мне посоветовать, как я могу получить эти два значения с помощью linq?

+2

Есть ли необходимость в Linq в этом сценарии? Казалось бы, лучше просто использовать XDocument и получить доступ к требуемому значению с помощью инструкции XPath. Кроме того, если вы попытались что-то сделать, предоставьте образец кода, вызывающего проблему. – gmiley

+0

Было бы лучше linq, иначе это не имеет значения ... Как я могу исправить это с помощью Xpath? –

+1

Покажите, что вы пробовали. – CSharpie

ответ

1

Похоже возможного дублирования this
Краткая версия:

XElement element = XElement.Parse(YourString); 
var prices = element.Elements("price") 
      .Select(item => item.Element("normalprice").Value); 
1

Эти значения могут быть извлечены с помощью Descendant в сочетании с Last:

var xml = XElement.Parse(xmlStr); 

    var normalPrice = xml 
    .Descendants("normalprice") 
    .Last() 
    .Value; 

    var pricetotalinclvat = xml 
    .Descendants("pricetotalinclvat") 
    .Last() 
    .Value; 
1

Вы можете попробовать это:

XDocument doc = XDocument.Load(path); 
var query = from price in doc.Descendants("price") 
      select new 
         { 
          NormalPrice = price.Element("normalprice").Value, 
          PriceTotalInclVat = price.Descendants("entry").Last().Element("pricetotalinclvat").Value 
         }; 

Чтобы избежать исключения нулевого в случае, если вы не имеете записей вы также можете сделать это:

var query = from price in doc.Descendants("price") 
      select new 
         { 
         NormalPrice = price.Element("normalprice").Value, 
         PriceTotalInclVat = price.Descendants("entry").Any()?price.Descendants("entry").Last().Element("pricetotalinclvat").Value:"0" 
         }; 

Или:

var query = from price in doc.Descendants("price") 
      let entries = price.Descendants("entry") 
      select new 
         { 
         NormalPrice = price.Element("normalprice").Value, 
         PriceTotalInclVat = entries!=null ? entries.Last().Element("pricetotalinclvat").Value : "0" 
         }; 
1

Если подход не имеет значения, загрузка содержимого в XDocument и доступ с помощью XPath, казалось бы больше смысла в этой ситуации:

Вы хотите использовать в System.Xml.XPath пространство имен с этим ...

System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Parse(xmlString); 
    decimal priceNormal = 0; 
    decimal.TryParse(xdoc.XPathSelectElement(@"/prices/price/normalprice").Value, out priceNormal); 
    decimal priceTotalInclvat = 0; 
    decimal.TryParse(xdoc.XPathSelectElement(@"/prices/price/entry[last()]/pricetotalinclvat").Value, out priceTotalInclvat); 
0

Я пробовал все решения на этой странице, но я не получил никакого результата. это так странно .this то, что я сделал, но это не является хорошим способом:

var document = XDocument.Load(url); 
     var root = document.Root; 

     if (root == null) 
      return; 

     var ns = root.GetDefaultNamespace(); 
     var mainNode = document.Element(ns + "prices"); 

     if (mainNode == null) 
     return; 


      var priceNode = mainNode.Elements(ns + "price").FirstOrDefault().Elements(); 
      var lastEntry = mainNode.Elements(ns + "price").FirstOrDefault().Elements().Last().Elements().Last().Elements(); 


      foreach (var element in lastEntry.Where(element => element.Name.LocalName == "pricetotalinclvat")) 
      { 
       plusPrice = element.Value; 
      } 

      foreach (var element in priceNode.Where(xElement => xElement.Name.LocalName == "price")) 
      { 
       price = element.Value; 
      } 

Любое предложение, чтобы сделать его лучше?

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