Как мне отредактировать значение определенного узла в XML, когда есть несколько узлов с одинаковым именем? - PullRequest
2 голосов
/ 05 июня 2019

Я пытаюсь отредактировать определенный узел в документе 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 Ответ

3 голосов
/ 05 июня 2019

Не выбирайте все теги name, а выбирайте только теги name, являющиеся потомками тега /Items/Item.

Запрос XPath будет выглядеть как /Items/Item/Name.

Вы можете проверить это здесь .Подробнее см. документацию .

...