c# - 当存在多个同名节点时,如何编辑 XML 中特定节点的值?

标签 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 code> 节点,我不希望更新该值。我知道问题出在 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>

最佳答案

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

XPath 查询类似于 /Items/Item/Name

您可以test it here 。请参阅documentation了解详情。

关于c# - 当存在多个同名节点时,如何编辑 XML 中特定节点的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56452169/

相关文章:

c# - ASP.NET Core 2.0+ 中 JwtBearerOptions.SaveToken 属性的用途是什么?

c# - 下拉选择 future 10 年的列表

java - 对单个元素而不是整个文档进行 XML 验证

元素的 XML/XSD 'extension' 始终具有未定义的复杂类型

python - Lxml 元素与 namespace 相等

c# - 为什么字符串是引用类型,但行为却与其他引用类型不同?

c# - 什么是 DetailsView.EnableModelValidation?

android - 在 Android manifest 中,如何要求两个硬件中的至少一个?

java - 使用 XSLT 转换在 XML 中创建 xmlns 属性

xml - 在 XML 中,如何/为什么可以在定义 namespace 之前使用它?