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

时间:2019-06-04 22:35:07

标签: c# xml xml-namespaces

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

1 个答案:

答案 0 :(得分:3)

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

XPath查询看起来像/Items/Item

您可以test it here。有关详细信息,请参见documentation