C# 从XML文件中提取特定项
全部, 我一直在编写一些代码,试图使用C#从XML文件中提取项目集合。我一直在四处阅读,并决定使用C# 从XML文件中提取特定项,c#,xml,linq,C#,Xml,Linq,全部, 我一直在编写一些代码,试图使用C#从XML文件中提取项目集合。我一直在四处阅读,并决定使用 using System.Xml.XPath; using System.Xml.Linq; 但是,由于XML层次结构的相对复杂性,我对如何访问相关元素感到有点困惑,在本例中,这些元素是来自以下XML的“dCost”和“iCost”: <?xml version="1.0" encoding="utf-8"?> <message xmlns:xsd="http://www.w
using System.Xml.XPath;
using System.Xml.Linq;
但是,由于XML层次结构的相对复杂性,我对如何访问相关元素感到有点困惑,在本例中,这些元素是来自以下XML的“dCost”和“iCost”:
<?xml version="1.0" encoding="utf-8"?>
<message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
pStart="2010-01-01T12:12:12"
pEnd="2010-01-01T12:12:12"
fYear="2010-11"
OrgID="21122211" xmlns="urn://www.XXXX.com/vcopdc/2011/01/v0.5">
<episodes>
<episode
eKey="001448101"
ur="1219765"
campus="1334"
eStart="17/01/2010 6:00:00 AM"
eEnd="17/01/2010 11:00:00 AM"
stream="X"
dob="6/12/1936 12:00:00 AM"
atsi="2"
pCode="3075">
<episodeCosts>
<episodeCost
area="A0902"
description="General ATOMIC"
account="GF"
dCost="0.0393072400937604"
iCost="0.156445858061913"
location="101"
sDate="17/01/2000 12:00:00 AM" />
<episodeCost
area="AAS2W"
description="General ATOMIC"
account="LAB"
dCost="0.0169883227585181"
iCost="0.0110702327817353"
location="101"
sDate="17/01/2000 12:00:00 AM" />
</episodeCosts>
</episode>
</episodes>
</message>
这不起作用,也就是说,它没有找到我想要的元素,因为我的语法不太正确。我看过很多例子,但是XML总是很少嵌入,所以很难扩展这些例子。任何帮助都将不胜感激
编辑:我现在也意识到,由于我的XML文件太大,我需要使用以下内容:
using (var reader = XmlReader.Create(strFileName))
{
while (reader.Read())
{
// Some code here.
}
}
再次感谢您的帮助。您的x路径中有两个插曲-是否应该是//消息/插曲/插曲/插曲
编辑:假设您的问题是x路径查询不返回任何结果。如果没有,会发生什么情况?您可以按要求执行此操作
var doc = XDocument.Load(strFileName);
var CostElements = doc.Elements("message").Elements("episodes").Elements("Episode").Elements("episodeCosts").Elements("EpisodeCost");
foreach(var cost in CostElements)
{
var iCost = cost.Attribute("icost").Value;
var dCost = cost.Attribute("dcost").Value;
}
这对您有用吗?我相信如果您删除了xmlns定义
xmlns=”urn://www.XXXX.com/vcopdc/2011/01/v0.5“
您的代码将正常工作。如果要使用Xml名称空间,请使用
XPathSelectElements方法(XNode、String、IXmlNamespaceResolver)。
详细信息我最终就是这样做的。也许将来它会帮助别人
double dTotalICostMM = 0.0, dTotalDCostMM = 0.0;
decimal dCost = Decimal.Zero, iCost = Decimal.Zero;
using (XmlReader reader = XmlReader.Create(strFileName))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "episodeCost")
{
dCost = Convert.ToDecimal(reader.GetAttribute("dCost"));
iCost = Convert.ToDecimal(reader.GetAttribute("iCost"));
}
}
// Add each cost to its total for the month
dTotalDCostMM += (double)dCost;
dTotalICostMM += (double)iCost;
}
谢谢您的帮助。是,它不会返回任何结果。很抱歉,你的编辑是对的,这就是我所拥有的。我现在就结束这件事。不幸的是,这不起作用。同样,它不向var CostElements返回任何内容。也就是说,CostElements.name=null,CostElements.value=null。谢谢你的帮助。另一件事是,我的XML文件可能很大,所以我现在希望使用“using(var reader=XmlReader.Create(strFileName)){…}”而不是上面提到的。
double dTotalICostMM = 0.0, dTotalDCostMM = 0.0;
decimal dCost = Decimal.Zero, iCost = Decimal.Zero;
using (XmlReader reader = XmlReader.Create(strFileName))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "episodeCost")
{
dCost = Convert.ToDecimal(reader.GetAttribute("dCost"));
iCost = Convert.ToDecimal(reader.GetAttribute("iCost"));
}
}
// Add each cost to its total for the month
dTotalDCostMM += (double)dCost;
dTotalICostMM += (double)iCost;
}