2011-11-18 51 views
0

我想解析一个NZB文件(这是XML)并总结字节属性。有时它完美地工作,有时它会返回零,我不明白为什么。据我所知,NZB文件具有相同的结构。总结XML属性有时返回零

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

它的工作,没有必要把C#的称号。这就是标签的用途。 – Amy

回答

2

也许和的初始值小于1024 字节?当你正在执行整数除法时,结果将被解析,所以小于1024的任何字节将返回零。

例如,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; 
} 

另外,我会避免发布暗示参与违禁品的文件。

+0

感谢您的快速回复,这没有把戏。这是我第一次玩XML文件。 (PS:没有违禁品,我订阅的频道上的所有电视节目) –

2

是否有可能总和足够小,以1024除以整数除以四舍五入?

一个例子:

int sum = 300; //300 
int sumDividedOnce = sum/1024; // 0 
int sumDividedTwice = sumDividedOnce/1024; // 0 
+0

感谢您的答复 - 不,这是一样的,如果我评论该线,并返回字节,而不是兆字节 –

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)); 
+0

将'XAttribute'显式转换为'int'的显式转换运算符与您的选择几乎完全相同。 – Ani

+0

啊。这是一个快速回答:) – Kit