xml - 如何处理第一个子节点之前和最后一个子节点之后的 xml 节点文本?

标签 xml delphi omnixml

<p> Normal text <b> bolded </b> finish normal text </p>

我正在使用 OmniXML 处理该 xml(示例减少)(但我相信该解决方案将适用于其他 XML 解析器)。我正在遍历 xml,每次处理 p 或 b 标签时,我都会更改一些字体设置等。

问题是,当我有一个 Node var 指向 p 标签时,我会这样做

Node.TextNode

它返回“普通文本粗体完成普通文本”完整文本,但我只想返回第一个标签之前的部分(以及最后一部分);这样,当您处理标签后,我可以更改字体设置,并打印粗体文本..

我怎样才能做到这一点?

最佳答案

uses
  OmniXML,
  OmniXMLUtils;

procedure ProcessNode(const node: IXMLNode; nodeText: TStrings);

  procedure CollectNodes(const node: IXMLNode; const nodeList: IXMLNodeList);
  var
    childNode: IXMLNode;
    iChild   : integer;
  begin
    for iChild := 0 to node.ChildNodes.Length-1 do begin
      childNode := node.ChildNodes.Item[iChild];
      if childNode.NodeType = TEXT_NODE then
        nodeText.Add(childNode.NodeValue)
      else if childNode.NodeType = ELEMENT_NODE then begin
        nodeText.Add(childNode.NodeName);
        CollectNodes(childNode, nodeList);
        nodeText.Add('/' + childNode.NodeName);
      end;
    end;
  end; { CollectNodes }

var
  childNode: IXMLNode;
  nodeList : IXMLNodeList;
begin
  nodeList := TXMLNodeList.Create;
  CollectNodes(node, nodeList);
end; { ProcessNode }

procedure TForm39.FormCreate(Sender: TObject);
var
  xml: IXMLDocument;
  nodeText: TStringList;
begin
  xml := CreateXMLDoc;
  if XMLLoadFromString(xml, '<test><p> Normal text <b> bolded </b> finish normal text </p></test>') then begin
    nodeText := TStringList.Create;
    try
      ProcessNode(xml.SelectSingleNode('test'), nodeText);
    finally FreeAndNil(nodeText); end;
  end;
end;

会给你:

p
 Normal text
b
 bolded
/b
 finish normal text
/p

关于xml - 如何处理第一个子节点之前和最后一个子节点之后的 xml 节点文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7272721/

相关文章:

delphi - 全方位 xml 创建 xml

delphi - iOS 上的 OmniXML : Invalid Unicode

javascript - 如何在 jQuery mobile 中显示 XML 中的图像?

xml - XSD:xs:schema 元素 "URL attribute"的含义

performance - 如何衡量循环方法和递归方法之间代码速度的差异?

delphi - 崩溃后恢复代码

delphi - 如何/如果仅使用表单和数据模块重构 Delphi 程序

java - 在 XML 中定义资源是否会导致解析开销?

java - Java 中的 XML 管道

delphi - 在 OmniXML 的 NodeAttributes 中添加换行符