使用C#将选择性XML数据加载到数据集中

本文关键字:数据 加载 数据集 集中 XML 选择性 使用 | 更新日期: 2023-09-27 18:01:27

欣赏一些关于如何在XML文件上使用XPath仅提取一些数据并将其加载到数据集中的指针。

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>节点加载帐户,如果可能的话,只需要数字、tradecurvalue和selectcurrvalue属性。我使用C#和3.5。

使用C#将选择性XML数据加载到数据集中

使用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
}

还可以使用XmlNodeListXmlNode,与其他相比重量轻

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

参考链接

在代码中评估此XPath表达式

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

这将选择(作为XML文档中顶部元素的子元素的任何summary元素的子级的任何account元素的(任何属性,命名为"number""tradecurrvalue""selectcurrvalue"

放大想要选择的可能属性名称的列表非常容易——只需将它们包含在管道分隔的名称列表中即可。