<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/