使用LINQ to XML删除项目

时间:2012-12-23 09:44:34

标签: c# xml linq-to-xml

我想使用LINQ to XML删除文件中的设备元素

我的文件是这样的

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <IncomingConfig>
    <ip>10.100.101.18</ip>
    <port>5060</port>
  </IncomingConfig>
  <Device>
    <username>xxx</username>
    <password>Pa$$w0rd1</password>
    <domain>go</domain>
    <Uri>xxxx@xxx.com</Uri>
  </Device>
   <Device>
    <username>yyy</username>
    <password>Pa$$w0rd1</password>
    <domain>go</domain>
    <Uri>yyyy@yyyy.com</Uri>
  </Device>

</settings>

我正在尝试这个,但它给了我一个NullReferenceException

public void DeleteDevice(List<Device> devices)
{
    var doc = XDocument.Load(PATH);

    foreach (Device device in devices)
    {
        doc.Element("Settings").Elements("Device").Where(c => c.Element("URI").Value == device.URI).Remove();
    }
    doc.Save(PATH);
}

有什么问题?

1 个答案:

答案 0 :(得分:3)

因为这个原因你得到了一个例外:

c.Element("URI").Value

您的<Device>元素没有名为<URI>的元素,因此c.Element("URI")返回null。

您可以将其更改为:

c.Element("Uri").Value

但我个人认为我会改变整个方法:

public void DeleteDevice(IEnumerable<Device> devices)
{
    var uris = new HashSet<string>(devices.Select(x => x.URI));
    var doc = XDocument.Load(FULL_PATH);
    doc.Element("settings")
       .Elements("Device")
       .Where(c => uris.Contains((string)c.Element("Uri")))
       .Remove();
    doc.Save(PATH);
}

这会使用Remove extension method,并转换为string而非使用.Value,如果有任何元素没有sipUri子元素,则您赢了没有例外。 (如果这代表了错误情况,您可能希望使用.Value代替,以便您不会继续使用无效数据,请注意。)

(我还会更改FULL_PATHPATH标识符,以遵循.NET命名约定。)