Загрузка выборочных данных XML в набор данных с использованием C # - PullRequest
2 голосов
/ 06 июля 2011

Оцените некоторые советы о том, как я могу использовать XPath для XML-файла, чтобы извлечь только некоторые данные и загрузить их в набор данных.

ds.ReadXml(fsReadXml);

загрузит весь xml в набор данных, но мое требование состоит в том, чтобы загружать только определенный узел и значения в набор данных.

Пример XML-данных:

<data cobdate="5 Jul 2011" DBStatus="">
  <view>BOTH</view>
  <show_acctnbr>true</show_acctnbr>
  <summary>
    <headings sum="Summary" real_per="Realized this period" real_trd="Profit/loss in trading currency" real_select="Profit/loss in selected currency" short_term="Short Term Profit/Loss" long_term="Long Term Profit/Loss" />
    <account number="A123456" curr_code="USD" curr_desc="US Dollars" tradecurrvalue="123,123.00" selectcurrvalue="123,123.00" managed="NO" />
    <account number="P123456" curr_code="USD" curr_desc="US Dollars" tradecurrvalue="0.00" selectcurrvalue="0.00" managed="NO" />
  </summary>
  <detail>
    <headings dateaq="Date acquired" datesld="Date sold" desc="Description" sec_nbr="Security number " qty="Quantity" cost="Cost basis" />
    <account number="A123456" currency="US Dollars">
      <item datesold="29 Apr 11" sec_nbr="1234" description="SOME VALUE(USD)" quantity="8,000" proceeds="123,123.0" />
      <item datesold="29 Apr 11" sec_nbr="4567" description="SOME VALUE(USD)" quantity="9,000" proceeds="123,123.0" />
    </account>
    <account number="P123456" currency="US Dollars">
      <item datesold="29 Apr 11" sec_nbr="1234" description="SOME VALUE(USD)" quantity="8,000" proceeds="123,123.0" />
      <item datesold="29 Apr 11" sec_nbr="4567" description="SOME VALUE(USD)" quantity="9,000" proceeds="123,123.00" />
    </account>
  </detail>
</data>

В данных этого примера мне просто нужно загрузить учетные записи из узла <summary> и, если возможно, только атрибуты number, tradecurrvalue и selectcurrvalue. Я использовал C # и 3.5.

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

С XDocument:

var doc = XDocument.Load(fileName);
var lst = doc
       .Descendants("summary")   // don't care where summary is
       .Elements("account ")     // direct child of <summary>
       .Select(x => new 
       {
          number = x.Attribute("number").Value,
          ...
       });

foreach(var account in lst) 
{
  .... // add to DataSet
}
2 голосов
/ 10 августа 2015

также можно использовать XmlNodeList и XmlNode , легкий вес по сравнению с другими

  foreach (XmlNode node in nodes)
            {
                dt.Rows.Add(node["Name"].InnerText.ToString(),
                            node["NoOfDay"].InnerText.ToString(),
                            node["dateColumn"].InnerText.ToString()
                           );
            }

Ссылка

1 голос
/ 06 июля 2011

Оцените это выражение XPath в своем коде :

/*/summary/account/@*
            [contains('|number|tradecurrvalue|selectcurrvalue|',
                      concat('|',name(),'|')
                      )
            ]

. Выбирает любой атрибут (любого элемента account, который является дочерним по отношению к любому элементу summary,дочерний элемент верхнего элемента в документе XML) с именем "number", "tradecurrvalue" или "selectcurrvalue"

Очень легко увеличить список возможных имен атрибутов, которые вы хотите выбрать - просто включите их всписок имен, разделенных каналом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...