Hi, I tried to make a FindNode that searches deep inside a XMLDocument, it finds recursively but only finds the first <w:p> text, but it doesn't find if there are more... how can I fix this?
I attached the xml file, but for the example, here's part of the code of the XML:
<w:r w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
<w:u w:val="single"/>
</w:rPr>
<!--hola edgar-->
<w:t>ЖАЛОБЫ</w:t>
</w:r>
<w:r w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
</w:rPr>
<w:t>____</w:t>
</w:r>
<w:r w:rsidR="005F1AD7" w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
<w:u w:val="single"/>
</w:rPr>
<w:t>{[complaints]}</w:t>
</w:r>
<w:r w:rsidR="002107F6" w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
<w:u w:val="single"/>
</w:rPr>
<w:tab/>
</w:r>
<w:r w:rsidR="002107F6" w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
<w:u w:val="single"/>
</w:rPr>
<w:tab/>
</w:r>
</w:p>
<w:p w14:paraId="59228417" w14:textId="1BF8370E" w:rsidR="00346D56" w:rsidRPr="00077AE0" w:rsidRDefault="00346D56" w:rsidP="00F12AEB">
<w:pPr>
<w:tabs>
<w:tab w:val="right" w:leader="underscore" w:pos="9781"/>
</w:tabs>
<w:spacing w:line="288" w:lineRule="auto"/>
<w:ind w:left="-1077"/>
<w:jc w:val="both"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00077AE0">
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="16"/>
<w:szCs w:val="16"/>
<w:u w:val="single"/>
</w:rPr>
<w:t>АНАМНЕЗ</w:t>
</w:r>
Here's my recursive function, I made a helper for TDOMNode_WithChildren:
function TSearchNode.FindNode(const aNodeName: DOMString;
aNodeContent: DOMString; const aNode: TDOMNode): TDOMNode;
var S: String; /// these two variables are for debugging only... so you can skip them
T: String;
function NodeFound(var Node: TDOMNode): boolean;
var vNode: TDOMNode;
bName: boolean;
begin
result := false;
if Node = nil then exit;
bName := Node.CompareName(aNodeName)=0;
if bName then begin
if UTF8CompareStr(Node.TextContent, aNodeContent)=0 then begin
result := true;
exit;
end;
end;
vNode := Node.FirstChild;
if assigned(vNode) then begin
S := vNode.NodeName;
T := vNode.TextContent;
end;
while assigned(vNode) and not result do begin
result := NodeFound(vNode);
S := vNode.NodeName;
T := vNode.TextContent;
if result then begin
Node := vNode; /// we must take the value out
break;
end;
vNode := vNode.NextSibling;
if assigned(vNode) then begin
S := vNode.NodeName;
T := vNode.TextContent;
end;
end;
end;
begin
if assigned(aNode) then begin
S := aNode.NodeName;
T := aNode.TextContent;
end;
if aNode = nil then
result := FFirstChild
else
if aNode.NextSibling = nil then
result := aNode.ParentNode.NextSibling
else
result := aNode.NextSibling;
while assigned(result) do begin
S := result.NodeName;
T := result.TextContent;
if NodeFound(result) then
break;
result := result.NextSibling;
if assigned(result) then begin
S := result.NodeName;
T := result.TextContent;
end;
end;
end;