我正在尝试解析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/
有没有明显的原因导致这种情况无效?有没有更好的方法呢?谢谢你的帮助。
答案 0 :(得分:2)
当使用整数除法除以1024时,总和是否足够小,可以舍入为0?
一个例子:
int sum = 300; //300
int sumDividedOnce = sum/1024; // 0
int sumDividedTwice = sumDividedOnce/1024; // 0
答案 1 :(得分:2)
也许sum的初始值小于1024 2 字节?当您执行整数除法时,结果将被终止,因此任何小于1024 2 字节的内容都将返回零。
例如,example NZB file @ 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;
}
顺便说一句,我会避免发布暗示涉及违禁品的文件。
答案 2 :(得分:1)
如果你改变
它是否有效Int32 sum = xFile.Descendants("segment").Sum(x => (int)x.Attribute("bytes"));
到
Int32 sum = xFile.Descendants("segment").Sum(x => int.Parse(x.Attribute("bytes").Value));