【问题标题】:C# XML Complex Node List - store each complex value into new objectC# XML 复杂节点列表 - 将每个复杂值存储到新对象中
【发布时间】:2019-01-05 09:31:20
【问题描述】:

我有一个看起来像这样的 .XML 文件(我通过 C# 中的 JSON 的 xml 序列化得到这个,这正是我想要的):

<?xml version="1.0" encoding="utf-8"?>
<HistoricalInstruments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <id>12345678</id>
  <context>My Context<context/>
  <historical_data>
  <HistroicalData>
      <operating_mic>WWW</operating_mic>
      <mic>WWW</mic>
      <isin>NO1234567</isin>
      <feed>18888</feed>
      <ticker>ddd</ticker>
      <name>ddd</name>
      <prev_close_date>0001-01-01T00:00:00</prev_close_date>
      <prev_close>0</prev_close>
      <volume>0</volume>
      <turnover>0</turnover>
      <bid>0</bid>
      <ask>0</ask>
      <currency>CHF</currency>
      <error_code>0</error_code>
      <historical_trades>
        <HistoricalTrades>
          <last>139.8</last>
          <date>2017-01-13T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>133.1</last>
          <date>2017-01-16T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>131.5</last>
          <date>2017-01-17T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>133.8</last>
          <date>2017-01-18T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>135.5</last>
          <date>2017-01-19T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>135.8</last>
          <date>2017-01-20T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>135.4</last>
          <date>2017-01-23T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>135.9</last>
          <date>2017-01-24T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>139</last>
          <date>2017-01-25T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>139.9</last>
          <date>2017-01-26T00:00:00</date>
        </HistoricalTrades>
      </historical_trades>
    </HistroicalData>
    .... list continues/this is just example I have a list of HistroicalData too
  </historical_data>
</HistoricalInstruments>

正如您在主 HistoricalData 节点中看到的,我还有另一个对象列表:

<historical_trades>
        <HistoricalTrades>
          <last>139.8</last>
          <date>2017-01-13T00:00:00</date>
        </HistoricalTrades>
        <HistoricalTrades>
          <last>133.1</last>
          <date>2017-01-16T00:00:00</date>
        </HistoricalTrades>
         </HistroicalData>
...
  </historical_data>
</HistoricalInstruments>

/ 由于这都在主节点history_data/HistroicalData内,所以在循环节点列表时我想得到这样的输出(只是原始示例):

  {operating_mic: WWW
  mic: WWW
  isin: NO1234567
  feed: 18888
  ticker: ddd
  currency: CHF
  last: 139.8}

--> 这是历史交易中的第一个“last”值!**

  {operating_mic: WWW
  mic: WWW
  isin: NO1234567
  feed: 18888
  ticker: ddd
  currency: CHF
  last: 133.1}

--> 这里是历史交易中“最后一个”的 SECOND 值,所有其他属性都相同!

我试过用这个但是没用:

   XDoc.LoadXml(histPricesFormatted);
                XmlNodeList PriceNodes = XDoc.SelectNodes("//historical_data/HistroicalData");
                SecurityPrice price = new SecurityPrice(xmlDoc);

                if (PriceNodes.Count == 0)
                {
                    return;
                }
                else
                {

                    foreach (XmlNode xn in PriceNodes)
                    {
                        if (xn["historical_trades"]!= null)
                        {

                            XmlNodeList histTradeNode = xn["historical_trades"].SelectNodes("//historical_trades/HistoricalTrades");
                            foreach (XmlNode trade in histTradeNode)
                            {
                                if (xn["ticker"] != null) price.ID = xn["ticker"].InnerText;
                                if (xn["currency"] != null) price.Currency = xn["currency"].InnerText;
                                if (xn["isin"] != null) price.ISIN = xn["isin"].InnerText;
                                if (trade["last"] != null) price.Price = double.Parse(xn["last"].InnerText);
                                if (xn["error_description"] != null) price.Notes = xn["error_description"].InnerText;
                            }
                        }
                    }

有人知道我哪里错了吗?

【问题讨论】:

  • 请解释你的意思是它没有工作。有例外吗?如果有,在哪一行?定义行为,它会更容易提供帮助。

标签: c# asp.net .net xml xmlnode


【解决方案1】:

使用 Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns = doc.Root.GetDefaultNamespace();

            var historicalData = doc.Descendants(ns + "HistroicalData").Select(x => new
            {
                operating_mic = (string)x.Element(ns + "operating_mic"),
                mic = (string)x.Element(ns + "mic"),
                isin = (string)x.Element(ns + "isin"),
                feed = (string)x.Element(ns + "feed"),
                ticker = (string)x.Element(ns + "ticker"),
                currency = (string)x.Element(ns + "currency"),
                trades = x.Descendants(ns + "last").Select(y => (decimal)y).ToList()
            }).Select(x => x.trades.Select(trade => new {
                operatring_mic = x.operating_mic,
                mic = x.mic,
                isin = x.isin,
                feed = x.feed,
                ticker = x.ticker,
                currency = x.currency,
                trade = trade
            })).SelectMany(x => x).ToList();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多