0

我想使用 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);
}

怎么了?

4

1 回答 1

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扩展方法,并且通过转换为string而不是使用.Value,如果有任何元素没有sipUri子元素,您将不会得到异常。(如果这代表了一个错误情况,您可能希望使用.Value它,这样您就不会继续使用无效数据,请注意。)

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

于 2012-12-23T09:45:58.250 回答