Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将xml节点文本处理到第一个子节点和最后一个子节点之后?_Xml_Delphi_Omnixml - Fatal编程技术网

如何将xml节点文本处理到第一个子节点和最后一个子节点之后?

如何将xml节点文本处理到第一个子节点和最后一个子节点之后?,xml,delphi,omnixml,Xml,Delphi,Omnixml,普通文本加粗完成普通文本 我用OmniXML处理xml(示例简化)(但我相信该解决方案将应用于其他xml解析器)。我正在遍历xml,每次处理p或b标记时,我都会更改一些字体设置等 问题是当我有一个指向p标记的节点变量时 Node.TextNode 它返回“normaltext bolded finish Normal text”完整的文本,但我只想返回第一个标记之前的部分(以及后面的最后部分);这样,当y处理标记后,我可以更改字体设置,并打印粗体文本 我怎么能做到 <p> Norm

普通文本加粗完成普通文本

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

问题是当我有一个指向p标记的节点变量时

Node.TextNode

它返回“normaltext bolded finish Normal text”完整的文本,但我只想返回第一个标记之前的部分(以及后面的最后部分);这样,当y处理标记后,我可以更改字体设置,并打印粗体文本

我怎么能做到

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

问题是我不知道“自由文本”实际上是一个子节点(类型为text\u node),而且我使用的是NodeText而不是NodeValue,现在一切都清楚了。。谢谢
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