对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/

是否有一个明显的原因,这是不工作?有更好的方法吗?谢谢你的帮助。

对XML属性求和有时返回0

也许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));