如何将节点的内部文本和 XML 提取为字符串?

use*_*674 3 xml delphi xml-parsing

我有以下 XML 结构:

<?xml version="1.0"?>
<main>
  <node1>
    <subnode1>
      <value1>101</value1>
      <value2>102</value2> 
      <value3>103</value3> 
    </subnode1>
    <subnode2>
      <value1>501</value1>
      <value2>502</value2> 
      <value3>503</value3> 
    </subnode2>
  </node1>
</main>
Run Code Online (Sandbox Code Playgroud)

在 Delphi 中,我正在寻找一个函数,它将节点的内部文本和 XML 作为字符串返回。例如对于<node1>字符串应该是(如果可能,包括缩进和换行符):

    <subnode1>
      <value1>101</value1>
      <value2>102</value2> 
      <value3>103</value3> 
    </subnode1>
    <subnode2>
      <value1>501</value1>
      <value2>502</value2> 
      <value3>503</value3> 
    </subnode2>
Run Code Online (Sandbox Code Playgroud)

我在 Delphi 10 中找不到这样的功能。

有这样的功能吗?

或者在 Delphi 10 中实现一个的最佳方法是什么?

Rem*_*eau 5

处理此问题的正确方法是使用实​​际的 XML 库,例如 Delphi 的本机TXMLDocument组件或IXMLDocument接口(或可用于 Delphi 的任意数量的第 3 方 XML 库)。您可以将XML加载到它,然后找到IXMLNode<node1>元素(或任何你想要元素),然后读取其XML根据需要财产。

例如:

uses
  ..., Xml.XMLIntf, Xml.XMLDoc;

var
  XML: DOMString;
  Doc: IXMLDocument;
  Node: IXMLNode;
begin
  XML := '<?xml version="1.0"?><main><node1>...</node1></main>';
  Doc := LoadXMLData(XML);
  Node := Doc.DocumentElement; // <main>
  Node := Node.ChildNodes['node1'];
  XML := Node.XML;
  ShowMessage(XML);
end;
Run Code Online (Sandbox Code Playgroud)

或者:

uses
  ..., Xml.XMLIntf, Xml.xmldom, Xml.XMLDoc;

var
  XML: DOMString;
  Doc: IXMLDocument;
  Node: IXMLNode;
  XPath: IDOMNodeSelect;
  domNode: IDOMNode;
begin
  XML := '<?xml version="1.0"?><main><node1>...</node1></main>';
  Doc := LoadXMLData(XML);
  XPath := Doc.DocumentElement.DOMNode as IDOMNodeSelect;
  domNode := XPath.selectNode('/main/node1');
  Result := TXMLNode.Create(domNode, nil, (Doc as IXmlDocumentAccess).DocumentObject);
  XML := Node.XML;
  ShowMessage(XML);
end;
Run Code Online (Sandbox Code Playgroud)