关于如何在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>
节点加载帐户,如果可能,只需要number,tradecurrvalue和selectcurrvalue属性。我使用C#和3.5。
答案 0 :(得分:4)
使用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
}
答案 1 :(得分:2)
还可以使用 XmlNodeList 和 XmlNode ,与其他人相比重量轻
foreach (XmlNode node in nodes)
{
dt.Rows.Add(node["Name"].InnerText.ToString(),
node["NoOfDay"].InnerText.ToString(),
node["dateColumn"].InnerText.ToString()
);
}
答案 2 :(得分:1)
在代码中评估此XPath表达式:
/*/summary/account/@*
[contains('|number|tradecurrvalue|selectcurrvalue|',
concat('|',name(),'|')
)
]
这将选择(任何account
元素的任何属性,该元素是任何summary
元素的子元素,该元素是XML文档中top元素的子元素),名为"number"
,{ {1}}或"tradecurrvalue"
可以很容易地扩大您想要选择的可能属性名称列表 - 只需将它们包含在竖线分隔的名称列表中。