2009-05-14 18 views
0

私はC#のXMLとXPathの初心者です。ここに私のXMLドキュメントの例です: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が他の場所に複数回表示される場合は、最初のものを更新したいだけです。

+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を渡すことはできませんが、あなたは常にXmlDocumentのXmlNodeのを渡す必要があります。 ノード名が変更されにくくハードコーディングできるので、関数内のノード名の受け渡しを省略しました。ただし、これらを関数に渡し、ハードコードされたノード名の代わりに文字列を使用することができます。

0

は、あなたのXPathは「// YourNodeNameHere」のようなものになりたいselectSingleNodeメソッドでMSDN Doc

を見てください。

あなたはノードは、あなたが、その後「nodeMustExist」ノードに到達するためにツリーをバックアップ横切ることができることを発見した後:

XmlNode nodeMustExistNode = yourNode.Parent["nodeMustExist]; 
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; 
    } 
} 
関連する問題