首页 > 解决方案 > 当有多个同名节点时,如何在 XML 中编辑特定节点的值?

问题描述

我正在尝试编辑 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>

标签: c#xmlxml-namespaces

解决方案


不要选择所有name标签,而是只选择name标签的子/Items/Item标签。

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

你可以在这里测试它。有关详细信息,请参阅文档


推荐阅读