【问题标题】:Get values of specific xml elements in c# by linq通过linq获取c#中特定xml元素的值
【发布时间】:2015-11-09 14:31:30
【问题描述】:

这是一个在线 xml 的结果:

<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 获得这两个值吗?

【问题讨论】:

  • 这种场景需要Linq吗?只使用 XDocument 并使用 XPath 语句访问所需的值似乎会更好。此外,如果您尝试过某事,请提供导致问题的代码示例。
  • linq 会更好,否则没关系...我如何用 Xpath 修复它?
  • 显示你迄今为止尝试过的内容。

标签: c# xml linq


【解决方案1】:

看起来可能与this重复
简短的版本是:

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

【讨论】:

    【解决方案2】:

    可以使用Descendant 结合Last 提取这些值:

      var xml = XElement.Parse(xmlStr);
    
      var normalPrice = xml
        .Descendants("normalprice")
        .Last()
        .Value;
    
      var pricetotalinclvat = xml
        .Descendants("pricetotalinclvat")
        .Last()
        .Value;
    

    【讨论】:

      【解决方案3】:

      如果方法无关紧要,在这种情况下,将内容加载到 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);
      

      【讨论】:

        【解决方案4】:

        你可以试试这个:

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

        【讨论】:

          【解决方案5】:

          我尝试了此页面中的所有解决方案,但没有得到任何结果。太奇怪了。这就是我所做的,但这不是一个好方法:

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

          有什么建议可以让它变得更好吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-23
            相关资源
            最近更新 更多