C# 在XML文档中更新或插入节点
我是C#中XML和XPath的初学者。下面是我的XML文档的一个示例:C# 在XML文档中更新或插入节点,c#,xml,xpath,C#,Xml,Xpath,我是C#中XML和XPath的初学者。下面是我的XML文档的一个示例: <root> <folder1> ... <folderN> ... <nodeMustExist>... <nodeToBeUpdated>some value</nodeToBeUpdated> .... </root> 也许还有其他更好、更简单的方法可以做到这一点。有什么建
<root>
<folder1>
...
<folderN>
...
<nodeMustExist>...
<nodeToBeUpdated>some value</nodeToBeUpdated>
....
</root>
也许还有其他更好、更简单的方法可以做到这一点。有什么建议吗
顺便说一下,如果NodeToBeUpdate在其他地方出现多次,我只想更新第一个。看看SelectSingleNode方法 您的xpath希望类似于“//YourNodeNameHere” 找到该节点后,您可以遍历该树以到达“nodeMustExist”节点:
XmlNode nodeMustExistNode = yourNode.Parent["nodeMustExist];
选择
的所有实例的XPath表达式如下:
/root/folder[nodeMustExist]/nodeToBeUpdated
这将更新文件夹中的所有节点:
public void UpdateNodes(XmlDocument doc, string newVal)
{
XmlNodeList folderNodes = doc.SelectNodes("folder");
if (folderNodes.Count > 0)
foreach (XmlNode folderNode in folderNodes)
{
XmlNode updateNode = folderNode.SelectSingleNode("nodeToBeUpdated");
XmlNode mustExistNode = folderNode.SelectSingleNode("nodeMustExist"); ;
if (updateNode != null)
{
updateNode.InnerText = newVal;
}
else if (mustExistNode != null)
{
XmlNode node = folderNode.OwnerDocument.CreateNode(XmlNodeType.Element, "nodeToBeUpdated", null);
node.InnerText = newVal;
folderNode.AppendChild(node);
}
}
}
如果要更新特定节点,则不能传递字符串nodeToBeUpdte,但必须传递XmlDocument的XmlNode。
我省略了在函数中传递节点名称,因为节点名称不太可能更改,并且可以硬编码。但是,您可以将它们传递给函数,并使用字符串而不是硬编码的节点名。我更改了方法的签名格式以避免水平滚动。我讨厌水平滚动。 /root/folder[*[name() = 'nodeMustExist']]/*[name() = 'nodeToBeUpdated']
void UpdateNode(xmlDocument xml,
string nodeMustExist,
string nodeToBeUpdte,
string newVal)
{
string xPath = "/root/folder[*[name() = '{0}']]/*[name() = '{1}']";
xPath = String.Format(xPath, nodeMustExist, nodeToBeUpdte);
foreach (XmlNode n in xml.SelectNodes(xPath))
{
n.Value = newVal;
}
}
public void UpdateNodes(XmlDocument doc, string newVal)
{
XmlNodeList folderNodes = doc.SelectNodes("folder");
if (folderNodes.Count > 0)
foreach (XmlNode folderNode in folderNodes)
{
XmlNode updateNode = folderNode.SelectSingleNode("nodeToBeUpdated");
XmlNode mustExistNode = folderNode.SelectSingleNode("nodeMustExist"); ;
if (updateNode != null)
{
updateNode.InnerText = newVal;
}
else if (mustExistNode != null)
{
XmlNode node = folderNode.OwnerDocument.CreateNode(XmlNodeType.Element, "nodeToBeUpdated", null);
node.InnerText = newVal;
folderNode.AppendChild(node);
}
}
}