当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素
Posted
技术标签:
【中文标题】当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素【英文标题】:How to remove an element from an xml using Xdocument when we have multiple elements with same name but different attributes 【发布时间】:2012-11-23 18:13:35 【问题描述】:我有一个如下所示的 xml 文档:
<Applications>
<myApp>
<add key="ErrorDestinationEventLog" value="EventLog" />
<add key="version" value="5.0.0.0" />
<add key="DebugMode_RUN" value="true" />
</myApp>
</Applications>
所有元素都有相同的元素名称但不同的属性。 如何使用 C# 中的 XDocument 从此 xml 中删除一个特定元素及其属性?
xd.Element("Applications").Element("myApp").Element(xe.Name).RemoveAll();
上述命令不起作用,因为所有元素都具有相同的名称。
除了名称之外,还有什么方法可以识别元素吗? 如果是这样,我如何使用它从 XDocument 中删除它?
【问题讨论】:
你调试过代码吗?你知道 .Element("myApp") 返回什么吗?只是寻找有关您所看到的确切情况的更多信息。 感谢您的建议。我知道 .Element("myApp") 返回名称为“myApp”的第一个元素,对吗? 【参考方案1】:string key = "version";
XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Descendants("add")
.Where(x => (string)x.Attribute("key") == key)
.Remove();
更新你几乎完成了这项工作。您错过的是按属性值过滤元素。这是您过滤和删除选定元素的代码:
xd.Element("Applications")
.Element("myApp")
.Elements("add")
.Where(x => (string)x.Attribute("key") == key)
.Remove();
【讨论】:
【参考方案2】:xd.Descendants("add")
.First(a => a.Attribute("key").Value == "version")
.Remove();
如果Applications
下的标签不是myApp
,包含add
,您可能更喜欢更安全的版本
xd.Descendants("myApp").First()
.Descendants("add")
.Where(x => (string)x.Attribute("key") == "version")
.Remove();
您也可以使用 XPath (System.Xml.XPath)
string key="version";
xd.XPathSelectElement(String.Format("//myApp/add[@key='0']",key)).Remove();
【讨论】:
感谢您的回复。我的 xml 确实有其他包含“添加”的标签。以上是关于当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素的主要内容,如果未能解决你的问题,请参考以下文章
mvc 从视图传递到Controller 多个不同的实体类接收如何做呢?