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代わりに使用して、無効なデータを続行しないようにすることをお勧めします。)

(また、.NET 命名規則に従うようにFULL_PATHおよび識別子を変更します。)PATH

于 2012-12-23T09:45:58.250 に答える