2015-10-16 68 views
0

有我想要更新的XML文档,但为了这样做,首先,我需要获取其中一个节点的ID。C#:无法从XML中检索属性值

<?xml version="1.0" encoding="utf-8"?> 
    <backupatmail> 
    (... backups with id 0 & 1) 
    <backup id="2"> 
     <foldername>Dwa</foldername> 
     <backupdate>16/10/2015</backupdate> 
     <comment>comment will be set on UI</comment> 
     <numberofparts>1</numberofparts> 
     <lastsucceed></lastsucceed> 
    </backup> 
    (... backups with id 3 & 4) 
    </backupatmail> 

我写了这个:

public static int GetSpecificBackupID(XDocument xdoc, string folderName) 
    { 
     int lastId = (int)xdoc.Descendants("backup").Where(e => e.Attribute("foldername").Value.Equals(folderName)).Single().Attribute("id"); 
     return lastId; 
    } 

但我不断地得到型 'System.NullReferenceException' 未处理的异常发生

你能指点我那个明显的问题吗? ;-)

的另一件事是(我们称之为奖金问题):

如何添加其他“其中”条件上述方法?我需要非常确定这个ID,所以我想过检查文件夹名称属性。

回答

4

foldername不是一个属性 - 它的一个元素。这就是为什么你在这里得到NullReferenceException e.Attribute("foldername").Value。正确的查询是

int lastId = (int)xdoc.Descendants("backup") 
    .Where(b => (string)b.Element("foldername") == folderName) 
    .Single().Attribute("id"); 

顺便说一句,您可以使用重载Single运营商和删除Where

int id = (int)xdoc.Descendants("backup") 
     .Single(b => (string)b.Element("foldername") == foldername) 
     .Attribute("id"); 
+0

谢谢!作为魅力工作!所以我认为,我需要这样做:backupatmail - root;备份 - 节点; id(备份) - 属性;文件夹名称 - 元素。我是否明白这一点? –

+0

尖括号中的所有内容'' - 这是一个元素。一切都是'blahblahblah =“...”' - 是一个属性。 –

+0

比我想象的更简单!再次感谢m8,很棒的支持! –