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

时间:2009-05-14 11:59:51

标签: c# xml xpath

我是C#的XML和XPath的初学者。以下是我的XML文档示例:

 <root>
   <folder1>
   ...
   <folderN>
      ...
      <nodeMustExist>...
      <nodeToBeUpdated>some value</nodeToBeUpdated>
  ....
 </root>

如果节点存在,我需要更新nodeToBeUdpated的值,或者如果nodeToBeUpdated不存在则在nodeMustExist之后添加此节点。函数的原型是这样的:

void UpdateNode(
                  xmlDocument xml, 
                  string nodeMustExist, 
                  string nodeToBeUpdte, 
                  string newVal
               )
{
   /*

   search for XMLNode with name = nodeToBeUpdate in xml 
   to XmlNodeToBeUpdated (XmlNode type?)
   if (xmlNodeToBeUpdated != null)
   {
      xmlNodeToBeUpdated.value(?) = newVal;
   }
   else
   {
      search for nodeMustExist in xml to xmlNodeMustExist obj
      if ( xmlNodeMustExist != null )
      {
          add xmlNodeToBeUpdated as next node
          xmlNodeToBeUpdte.value = newVal;
       }
    }

   */
}

也许有其他更好,更简单的方法来做到这一点。有什么建议吗?

顺便说一下,如果nodeToBeUpdated在其他地方出现多次,我只想更新第一个。

3 个答案:

答案 0 :(得分:1)

选择<nodeToBeUpdated>的所有实例的XPath表达式将是:

/root/folder[nodeMustExist]/nodeToBeUpdated

或者,以更通用的形式:

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

答案 1 :(得分:1)

这是为了更新文件夹中的所有节点:

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。 我省略了函数中节点名称的传递,因为节点名称不太可能改变并且可以硬编码。但是,您可以将这些函数传递给函数并使用字符串而不是硬编码的节点名称。

答案 2 :(得分:0)

查看SelectSingleNode方法MSDN Doc

你的xpath想要像“// YourNodeNameHere”;

一旦找到该节点,您就可以遍历树以进入'nodeMustExist'节点:

XmlNode nodeMustExistNode = yourNode.Parent["nodeMustExist];