首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OmniXML中替换节点xml?

如何在OmniXML中替换节点xml?
EN

Stack Overflow用户
提问于 2014-01-28 10:49:44
回答 1查看 1.1K关注 0票数 2

我有一个使用OmniXML的Delphi程序加载的xml文档。如何用xml字符串定义的新节点替换特定节点?

或者,换句话说,我如何编辑节点的xml表示并应用这些更改?类似于XMLNode.SetXML(NewXML:String):

代码语言:javascript
复制
XMLNode.SetXML('<Test><TestNode>This is a test</TestNode></Test>');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-29 03:42:00

我无法找到一种方法将现有的XML替换为新的XML (特别是如果该XML有多个级别的节点)。

然而,我确实想出了如何完成你想要做的事情。

  • 为新的XML内容创建一个新的临时XML文档
  • 在现有XML结构中创建一个新节点,作为拥有要替换的节点的父节点的子节点。
  • 将节点从临时XML文档复制到新创建的子节点中。
  • 删除原始节点并将其替换为您创建的新子节点(使用父节点的ReplaceNode)。

下面是一个简单的控制台应用程序,它使用下面的XML开始操作(保存在test.xml中,保存在我的机器上的一个本地文件夹中)。XML文件包含此内容(为了简洁起见,我省略了XML处理指令,但代码也适用于它):

代码语言:javascript
复制
<AddInList>
  <AddInItem>
    <Title>Original title</Title>
    <Description>Original description</Description>
  </AddInItem>
</AddInList>

守则:

代码语言:javascript
复制
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中的最终输出

代码语言:javascript
复制
<AddInList>
  <AddInItem>
    <Title>This is a test node</Title>
    <Description>New description</Description>
  </AddInItem>
</AddInList>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21403546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档