对XML属性求和有时返回0
本文关键字:返回 求和 XML 属性 | 更新日期: 2023-09-27 18:15:12
我试图解析一个NZB文件(这是XML)和求和字节属性。有时它工作得很好,有时它返回零,我不知道为什么。据我所知,NZB文件具有相同的结构。
private Int32 processNZB(string sFilename)
{
XDocument xFile = XDocument.Load(sFilename);
Int32 sum = xFile.Descendants("segment").Sum(x => (int)x.Attribute("bytes"));
sum = (int)(sum / 1024 / 1024); // bytes -> MB
return sum;
}
源代码和示例文件可以在这里找到:http://jonathanslaven.com/.for/.stackoverflow/
是否有一个明显的原因,这是不工作?有更好的方法吗?谢谢你的帮助。
也许sum的初始值小于10242字节?当您执行整数除法时,结果将被结构化,因此任何小于10242字节将返回零。
例如,示例NZB文件@ wikipedia在运行您的算法时将给出0。
编辑:检查"坏"文件(实际上,它是没有遵循规范的"好"文件),它不起作用的原因是根元素的默认名称空间是"http://www.newzbin.com/DTD/2003/nzb"
,这意味着任何子节点都将继承这个名称空间。
这意味着您的查询.Descendants("segment")
不返回任何节点。附加正确的命名空间可以解决这个问题。
下面展示了如何修改代码来读取这样的文件。
private int ProcessNzb(string sFilename)
{
XDocument xDoc = XDocument.Load(sFilename);
return xDoc
.Descendants(xDoc.Root.Name.Namespace + "segment")
.Sum(x => (int) x.Attribute("bytes")) / 1024 / 1024;
}
说句题外话,我会避免发布可能涉及违禁品的文件。
是否有可能在使用整数除法除以1024时将总和舍入到0 ?
一个例子:
int sum = 300; //300
int sumDividedOnce = sum/1024; // 0
int sumDividedTwice = sumDividedOnce/1024; // 0
如果你改变
Int32 sum = xFile.Descendants("segment").Sum(x => (int)x.Attribute("bytes"));
Int32 sum = xFile.Descendants("segment").Sum(x => int.Parse(x.Attribute("bytes").Value));