2013-02-06 85 views
1

我需要在添加元素一些幫助,現在我這樣做:XML C#添加元素使用LINQ到XML

XDocument xDoc = XDocument.Load(testFile); 
xDoc.Descendants("SQUIBLIST") 
    .FirstOrDefault() 
    .Add(new XElement("Sensor", 
      new XAttribute("ID", id + 1), 
      new XAttribute("Name", "Squib" + (id + 1).ToString()), 
      new XAttribute("Used", "True"))); 
xDoc.Save(testFile); 

和我得到(例如):

<Sensor ID="26" Name="Squib26" Used="True" /> 

我想要的是這樣的:

<Sensor ID="26" Name="Squib26" Used="True"></Sensor> 

我找不到辦法做到這一點。 皮斯給我一個線索。謝謝!

+6

這些都是同樣的事情。你爲什麼要第二個而不是第一個? – JLRishe

+0

潛在重複:http://stackoverflow.com/questions/6355147/how-do-you-force-explicit-tag-closing-with-linq-xml http://stackoverflow.com/questions/462747/explicit-element -closing-tags-with-system-xml -linq-namespace – zimdanen

+1

我強烈建議重新格式化你的代碼,以便在堆棧溢出時使用更短的行 - *當然*。 –

回答

4

可以包括一個空字符串,以迫使它添加一個空的文本節點:

new XElement("Sensor", 
    new XAttribute("ID", id + 1), 
    new XAttribute("Name", "Squib" + (id + 1).ToString()), 
    new XAttribute("Used", "True"), 
    "") 

但是,你應該考慮爲什麼你真的需要這個。通常讀取XML的應用程序根本不應該關心這個區別。

另請注意,如果沒有任何SQUIBLIST元素,則通過調用FirstOrDefault().Add(...)可以使NullReferenceException失敗。它會至少更清晰地使用First(),這樣可以失敗,如果沒有這樣的元素,而不是返回null

+0

非常感謝Jon,完美的工作,我也按照你的建議重新編寫了代碼。 –

2

試試這個:

xDoc.Descendants("SQUIBLIST") 
     .FirstOrDefault() 
     .Add(
      new XElement("Sensor", 
      new XAttribute("ID", id + 1), 
      new XAttribute("Name", "Squib" + (id + 1).ToString()), 
      new XAttribute("Used", "True") 
      ,"" //<-- this will represent the value of <Sensor> 
));