求和XML属性有时会返回零

时间:2011-11-18 15:59:48

标签: c# xml .net-3.5 linq-to-xml

我正在尝试解析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/

有没有明显的原因导致这种情况无效?有没有更好的方法呢?谢谢你的帮助。

3 个答案:

答案 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));