有多个同名节点时,如何编辑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了解详情。
我正在尝试编辑 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了解详情。