2009-05-14 2 views
0

Я новичок в XML и XPath на C#. Вот пример моего XML-документ:Обновление или вставка узла в XML-документе

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

Что мне нужно, чтобы обновить значение nodeToBeUdpated, если узел существует или добавить этот узел после nodeMustExist если nodeToBeUpdated нет. Прототипом функции является примерно следующее:

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 появляется более одного раза в других местах, я просто хочу обновить первый.

+0

Я изменил формат подписи вашего метода, чтобы избавиться от горизонтальной прокрутки. Я ненавижу горизонтальную прокрутку. – Welbog

ответ

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, но вам придется пройти XmlNode в XmlDocument. Я пропустил прохождение имен узлов в функции, так как имена узлов вряд ли изменятся и могут быть жестко закодированы. Однако вы можете передать их этим функциям и использовать строки вместо имен жестко заданных узлов.

0

Посмотрите на метод SelectSingleNode MSDN Doc

ваш XPath хочет быть что-то вроде "// YourNodeNameHere";

как только вы обнаружили, что узел, то вы можете перемещаться обратно вверх по дереву, чтобы добраться до узла «nodeMustExist»:

XmlNode nodeMustExistNode = yourNode.Parent["nodeMustExist]; 
1

Выражение XPath, который выбирает все экземпляры <nodeToBeUpdated> бы это:

/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; 
    } 
} 
Смежные вопросы