2014-01-28 83 views
2

我有一個使用OmniXML的Delphi程序加載的xml文檔。我如何用xml字符串定義的新節點替換特定的節點?或者,換句話說,如何編輯節點的xml表示並應用更改? 喜歡的東西XMLNode.SetXML(NewXML:字符串):如何在OmniXML中替換節點xml?

XMLNode.SetXML('<Test><TestNode>This is a test</TestNode></Test>'); 
+0

太好了,謝謝!現在的問題更加清晰。 – Ivo

回答

0

我不能找到一種方法,實際上取代了新的XML(尤其是如果XML有多個級別的節點)的節點現有的XML。

但是,我弄清楚瞭如何完成你想要做的事情。

  • 爲新的XML內容創建一個新的,臨時的XML文檔
  • 創建在現有的XML結構的新節點擁有您要更換的節點的父節點的孩子。
  • 將臨時XML文檔中的節點複製到新創建的子節點中。
  • 刪除原始節點並將其替換爲您創建的新子節點(使用父節點的ReplaceNode)。

下面是一個簡單的示例控制檯應用程序,使用以下XML開始(保存在本機的本地文件夾中的test.xml)。 XML文件包含這個內容(我略去了XML處理指令,但代碼與它):

<AddInList> 
    <AddInItem> 
    <Title>Original title</Title> 
    <Description>Original description</Description> 
    </AddInItem> 
</AddInList> 

代碼:

program XMLReplaceNodeContent; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    OmniXML, 
    OmniXMLUtils; 

var 
    XMLDoc: IXMLDocument; 
    TempDoc: IXMLDocument; 

    OldNode, NewNode, NodeToDelete: IXMLNode; 

const 
    XMLFile = 'e:\tempfiles\Test.xml'; 

    NewXML = '<AddInItem>' + 
      '<Title>This is a test node</Title>' + 
      '<Description>New description</Description>' + 
      '</AddInItem>'; 

begin 
    XMLDoc := CreateXMLDoc; 
    // Turn off any formatting. We'll add it back later, if you want 
    XMLDoc.PreserveWhiteSpace := False; 
    XMLDoc.Load(XMLFile); 

    TempDoc := CreateXMLDoc; 
    TempDoc.PreserveWhiteSpace := False; 
    TempDoc.LoadXML(NewXML); 

    XMLDoc.SelectSingleNode('AddInList', OldNode); 
    OldNode.SelectSingleNode('AddInItem', NodeToDelete); 

    // Create replacement node(s) from new XML 
    NewNode := XMLDoc.CreateElement('AddInItem'); 

    // Copy replacement nodes to new node of original XML 
    CopyNode(TempDoc.DocumentElement, NewNode, True); 

    // Replace the original node with the new node 
    OldNode.ReplaceChild(NewNode, NodeToDelete); 

    // To prevent formatting of XML, comment this line and 
    // uncomment the next one 
    XMLSaveToFile(XMLDoc, XMLFile, ofIndent); 
    // XMLDoc.Save(XMLFile); 

    Writeln('XML with replace node saved successfully'); 
    Readln; 
end. 

Test.xml最後的輸出:

<AddInList> 
    <AddInItem> 
    <Title>This is a test node</Title> 
    <Description>New description</Description> 
    </AddInItem> 
</AddInList> 
+0

謝謝,它的工作原理!評論已丟失,例如'<! - 這是一條評論 - >'被替換爲'<#comment/>',但我可以處理。 – Ivo