C# 在XML文档中更新或插入节点

C# 在XML文档中更新或插入节点,c#,xml,xpath,C#,Xml,Xpath,我是C#中XML和XPath的初学者。下面是我的XML文档的一个示例: <root> <folder1> ... <folderN> ... <nodeMustExist>... <nodeToBeUpdated>some value</nodeToBeUpdated> .... </root> 也许还有其他更好、更简单的方法可以做到这一点。有什么建

我是C#中XML和XPath的初学者。下面是我的XML文档的一个示例:

 <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);
                }

            }
        }