从 xmlDocument 中选择特定的 xml 节点,然后更改 xml 节点的属性

Posted

技术标签:

【中文标题】从 xmlDocument 中选择特定的 xml 节点,然后更改 xml 节点的属性【英文标题】:Select specific xml node from xmlDocument then change xml node's attribute 【发布时间】:2010-09-07 21:58:25 【问题描述】:

我在 C# 中的 xml 文档中有一个简单的 xml 节点,我想查询它,然后将 visible 属性的值设置为 false。下面是xml。我需要能够通过节点名称(DGField)和 text_id(Test.ChangeRank)来选择节点。有谁知道如何做到这一点?提前致谢。

<DGField text_id="Test.ChangeRank" template="Ranking" visible="true">

【问题讨论】:

【参考方案1】:

假设您的 XmlDocument 被称为 doc,那么以下应该可以工作。

  XmlNode node = doc.SelectSingleNode("//DGField[@text_id='Test.ChangeRank']");
  if (node != null)
  
    node.Attributes["visible"].Value = "false";
  

这可以通过更多的错误检查来确保被更改的属性存在等,但这样可以保持干净。

基本上,第一行使用 XPath 表达式来定位 text_id='Test.ChangeRank' 的 DGField 元素。如果找到,则返回节点,然后用于操作所需的属性值。

我在 XPath 查询中使用了“//”语法,以便搜索整个 Xml 文档,这不是最佳的,更具体的 XPath 可以更好地执行。例如,如果您有一个看起来像这样的完整文档

<root>
  <DGFields>
    <DGField text_id='1' template='Ranking' visible='true' />
    <DGField text_id='Test.ChangeRank' template='Ranking' visible='true' />
  </DGFields>
</root>

然后可以使用更具体的 XPath 查询,如下所示

XmlNode node = doc.SelectSingleNode(
  "root/DGFields/DGField[@text_id='Test.ChangeRank']");

【讨论】:

【参考方案2】:

有多种方法可以做到这一点。我认为使用 XmlDocument 和 Regex 是最好的选择。

这是 XML 方法:

        XmlDocument xdoc = new XmlDocument();
        xdoc.Load(@"c:\myxml.xml");
        XmlNode xn = xdoc.SelectSingleNode("//DGField[@text_id='Test.ChangeRank']");
        xn.Attributes["visible"].Value = "false";

【讨论】:

以上是关于从 xmlDocument 中选择特定的 xml 节点,然后更改 xml 节点的属性的主要内容,如果未能解决你的问题,请参考以下文章

从 XmlDocument 中获取带有换行符的缩进 XML 的最简单方法是啥?

将 XML 文件读入 XmlDocument

使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?

c# xmldocument 获取特定节点之后的所有兄弟节点

C#将多个XMLNode或XMLNodeList从一个XMLDocument复制到另一个XMLDocument

从 XmlDocument 中解析大小和位置对象?