我想使用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);
}
有什么问题?
答案 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_PATH
和PATH
标识符,以遵循.NET命名约定。)