有多个同名节点时,如何编辑XML中特定节点的值?

How do I edit the value of a specific node in XML when there are multiple nodes with the same name?

我正在尝试编辑 XML 文档中的特定节点。我有以下 XML 数据:

<Items xmlns="http://foo.com/blah/blah">
  <Item>
    <Format>1</Format>
    <Name>Edit this one</Name>
    <MetaDataDictionary>
      <MetaData>
        <Name>Do not edit this one</Name>
        <Value>0</Value>
      </MetaData>
    </MetaDataDictionary>
  </Item>
  <Item>
    <Format>1</Format>
    <Name>Edit this one</Name>
    <MetaDataDictionary>
      <MetaData>
        <Name>Do not edit this one</Name>
        <Value>0</Value>
      </MetaData>
    </MetaDataDictionary>
  </Item>
</Items>

我想为每个 Item/Name 节点内容附加一个数字,但不向 Metadata/Name 节点附加一个数字,将文件保存为 test_n.xml 并重复 n 次。

我正在使用的代码似乎让我得到了我想要的 Item/Name 节点并正确保存了文件,但它也更新了 Metadata/Name 节点,我不想要该值被更新。我知道问题出在 navigator.Select 调用中,但我只是不知道如何更新一个并跳过另一个。

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XPathNavigator navigator = doc.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("at", "http://foo.com/blah/blah");
for (int i = 0; i < 10; i++)
{
    foreach (XPathNavigator nav in navigator.Select("//at:Name", manager))
    {
        var currValue = nav.Value;
        nav.SetValue(currValue + " " + i);
    }
   doc.Save("test_" + i + ".xml");
}

最后我希望它是:

<Items xmlns="http://foo.com/blah/blah">
  <Item>
    <Format>1</Format>
    <Name>Edit this one 0</Name>
    <MetaDataDictionary>
      <MetaData>
        <Name>Do not edit this one</Name>
        <Value>0</Value>
      </MetaData>
    </MetaDataDictionary>
  </Item>
  <Item>
    <Format>1</Format>
    <Name>Edit this one 0</Name>
    <MetaDataDictionary>
      <MetaData>
        <Name>Do not edit this one</Name>
        <Value>0</Value>
      </MetaData>
    </MetaDataDictionary>
  </Item>
</Items>

不要 select 所有 name 标签,而是 select 只有 name 个标签,它们是 /Items/Item 标签的子标签。

XPath 查询看起来像 /Items/Item/Name

您可以test it here. See the documentation了解详情。