summaryrefslogtreecommitdiff
path: root/packages/fcl-base/examples/xmldump.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/fcl-base/examples/xmldump.pp')
-rw-r--r--packages/fcl-base/examples/xmldump.pp71
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/fcl-base/examples/xmldump.pp b/packages/fcl-base/examples/xmldump.pp
new file mode 100644
index 0000000000..eb09ac37a0
--- /dev/null
+++ b/packages/fcl-base/examples/xmldump.pp
@@ -0,0 +1,71 @@
+
+{$MODE objfpc}
+{$H+}
+
+program xmldump;
+uses sysutils, DOM, xmlread;
+const
+ NodeNames: array[ELEMENT_NODE..NOTATION_NODE] of String = (
+ 'Element',
+ 'Attribute',
+ 'Text',
+ 'CDATA section',
+ 'Entity reference',
+ 'Entity',
+ 'Processing instruction',
+ 'Comment',
+ 'Document',
+ 'Document type',
+ 'Document fragment',
+ 'Notation'
+ );
+
+procedure DumpNode(node: TDOMNode; spc: String);
+var
+ i: Integer;
+ attr: TDOMNode;
+begin
+ Write(spc, NodeNames[node.NodeType]);
+ if Copy(node.NodeName, 1, 1) <> '#' then
+ Write(' "', node.NodeName, '"');
+ if node.NodeValue <> '' then
+ Write(' "', node.NodeValue, '"');
+
+ if (node.Attributes <> nil) and (node.Attributes.Length > 0) then begin
+ Write(',');
+ for i := 0 to node.Attributes.Length - 1 do begin
+ attr := node.Attributes.Item[i];
+ Write(' ', attr.NodeName, ' = "', attr.NodeValue, '"');
+ end;
+ end;
+ WriteLn;
+
+ if node.FirstChild <> nil then
+ DumpNode(node.FirstChild, spc + ' ');
+ if node.NextSibling <> nil then
+ DumpNode(node.NextSibling, spc);
+end;
+
+var
+ xml: TXMLDocument;
+begin
+ if ParamCount <> 1 then begin
+ WriteLn('xmldump <xml or dtd file>');
+ exit;
+ end;
+
+ if UpCase(ExtractFileExt(ParamStr(1))) = '.DTD' then
+ ReadDTDFile(xml,ParamStr(1))
+ else
+ ReadXMLFile(xml,ParamStr(1));
+
+ WriteLn('Successfully parsed the document. Structure:');
+ WriteLn;
+ if Assigned(xml.DocType) then
+ begin
+ WriteLn('DocType: "', xml.DocType.Name, '"');
+ WriteLn;
+ end;
+ DumpNode(xml, '| ');
+ xml.Free;
+end.