mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 13:59:07 +02:00
* xmlwrite.pp, started implementing the streaming API.
git-svn-id: trunk@20924 -
This commit is contained in:
parent
3d17ae49af
commit
901eb84b3d
@ -81,14 +81,19 @@ type
|
|||||||
procedure VisitDocument(Node: TDOMNode);
|
procedure VisitDocument(Node: TDOMNode);
|
||||||
procedure VisitDocument_Canonical(Node: TDOMNode);
|
procedure VisitDocument_Canonical(Node: TDOMNode);
|
||||||
procedure VisitElement(Node: TDOMNode);
|
procedure VisitElement(Node: TDOMNode);
|
||||||
procedure VisitText(Node: TDOMNode);
|
procedure WriteString(const Text: XMLString);
|
||||||
procedure VisitCDATA(Node: TDOMNode);
|
procedure WriteCDATA(const Text: XMLString);
|
||||||
procedure VisitComment(Node: TDOMNode);
|
procedure WriteComment(const Text: XMLString);
|
||||||
procedure VisitFragment(Node: TDOMNode);
|
procedure VisitFragment(Node: TDOMNode);
|
||||||
procedure VisitAttribute(Node: TDOMNode);
|
procedure VisitAttribute(Node: TDOMNode);
|
||||||
procedure VisitEntityRef(Node: TDOMNode);
|
procedure VisitEntityRef(Node: TDOMNode);
|
||||||
procedure VisitDocumentType(Node: TDOMNode);
|
procedure VisitDocumentType(Node: TDOMNode);
|
||||||
procedure VisitPI(Node: TDOMNode);
|
procedure VisitPI(Node: TDOMNode);
|
||||||
|
|
||||||
|
procedure WriteProcessingInstruction(const Target, Data: XMLString);
|
||||||
|
procedure WriteEntityRef(const Name: XMLString);
|
||||||
|
procedure WriteAttributeString(const Name, Value: XMLString);
|
||||||
|
procedure WriteDocType(const Name, PubId, SysId, Subset: XMLString);
|
||||||
public
|
public
|
||||||
constructor Create(AStream: TStream; ANameTable: THashTable);
|
constructor Create(AStream: TStream; ANameTable: THashTable);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -401,11 +406,11 @@ begin
|
|||||||
case node.NodeType of
|
case node.NodeType of
|
||||||
ELEMENT_NODE: VisitElement(node);
|
ELEMENT_NODE: VisitElement(node);
|
||||||
ATTRIBUTE_NODE: VisitAttribute(node);
|
ATTRIBUTE_NODE: VisitAttribute(node);
|
||||||
TEXT_NODE: VisitText(node);
|
TEXT_NODE: WriteString(TDOMCharacterData(node).Data);
|
||||||
CDATA_SECTION_NODE: VisitCDATA(node);
|
CDATA_SECTION_NODE: WriteCDATA(TDOMCharacterData(node).Data);
|
||||||
ENTITY_REFERENCE_NODE: VisitEntityRef(node);
|
ENTITY_REFERENCE_NODE: VisitEntityRef(node);
|
||||||
PROCESSING_INSTRUCTION_NODE: VisitPI(node);
|
PROCESSING_INSTRUCTION_NODE: VisitPI(node);
|
||||||
COMMENT_NODE: VisitComment(node);
|
COMMENT_NODE: WriteComment(TDOMCharacterData(node).Data);
|
||||||
DOCUMENT_NODE:
|
DOCUMENT_NODE:
|
||||||
if FCanonical then
|
if FCanonical then
|
||||||
VisitDocument_Canonical(node)
|
VisitDocument_Canonical(node)
|
||||||
@ -615,52 +620,62 @@ begin
|
|||||||
FNSHelper.PopScope;
|
FNSHelper.PopScope;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitText(node: TDOMNode);
|
procedure TXMLWriter.WriteString(const Text: XMLString);
|
||||||
begin
|
begin
|
||||||
ConvWrite(TDOMCharacterData(node).Data, TextSpecialChars, TextnodeCallbacks[FCanonical]);
|
ConvWrite(Text, TextSpecialChars, TextnodeCallbacks[FCanonical]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitCDATA(node: TDOMNode);
|
procedure TXMLWriter.WriteCDATA(const Text: XMLString);
|
||||||
begin
|
begin
|
||||||
if not FInsideTextNode then
|
if not FInsideTextNode then
|
||||||
wrtIndent;
|
wrtIndent;
|
||||||
if FCanonical then
|
if FCanonical then
|
||||||
ConvWrite(TDOMCharacterData(node).Data, TextSpecialChars, @TextnodeCanonicalCallback)
|
ConvWrite(Text, TextSpecialChars, @TextnodeCanonicalCallback)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
wrtChars('<![CDATA[', 9);
|
wrtChars('<![CDATA[', 9);
|
||||||
ConvWrite(TDOMCharacterData(node).Data, CDSectSpecialChars, @CDSectSpecialCharCallback);
|
ConvWrite(Text, CDSectSpecialChars, @CDSectSpecialCharCallback);
|
||||||
wrtChars(']]>', 3);
|
wrtChars(']]>', 3);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitEntityRef(node: TDOMNode);
|
procedure TXMLWriter.WriteEntityRef(const Name: XMLString);
|
||||||
begin
|
begin
|
||||||
wrtChr('&');
|
wrtChr('&');
|
||||||
wrtStr(node.NodeName);
|
wrtStr(Name);
|
||||||
wrtChr(';');
|
wrtChr(';');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitPI(node: TDOMNode);
|
procedure TXMLWriter.VisitEntityRef(node: TDOMNode);
|
||||||
|
begin
|
||||||
|
WriteEntityRef(node.NodeName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TXMLWriter.WriteProcessingInstruction(const Target, Data: XMLString);
|
||||||
begin
|
begin
|
||||||
if not FInsideTextNode then wrtIndent;
|
if not FInsideTextNode then wrtIndent;
|
||||||
wrtStr('<?');
|
wrtStr('<?');
|
||||||
wrtStr(TDOMProcessingInstruction(node).Target);
|
wrtStr(Target);
|
||||||
if TDOMProcessingInstruction(node).Data <> '' then
|
if Data <> '' then
|
||||||
begin
|
begin
|
||||||
wrtChr(' ');
|
wrtChr(' ');
|
||||||
// TODO: How does this comply with c14n??
|
// TODO: How does this comply with c14n??
|
||||||
ConvWrite(TDOMProcessingInstruction(node).Data, LineEndingChars, @TextnodeNormalCallback);
|
ConvWrite(Data, LineEndingChars, @TextnodeNormalCallback);
|
||||||
end;
|
end;
|
||||||
wrtStr('?>');
|
wrtStr('?>');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitComment(node: TDOMNode);
|
procedure TXMLWriter.VisitPI(node: TDOMNode);
|
||||||
|
begin
|
||||||
|
WriteProcessingInstruction(TDOMProcessingInstruction(node).Target, TDOMProcessingInstruction(node).Data);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TXMLWriter.WriteComment(const Text: XMLString);
|
||||||
begin
|
begin
|
||||||
if not FInsideTextNode then wrtIndent;
|
if not FInsideTextNode then wrtIndent;
|
||||||
wrtChars('<!--', 4);
|
wrtChars('<!--', 4);
|
||||||
// TODO: How does this comply with c14n??
|
// TODO: How does this comply with c14n??
|
||||||
ConvWrite(TDOMCharacterData(node).Data, LineEndingChars, @TextnodeNormalCallback);
|
ConvWrite(Text, LineEndingChars, @TextnodeNormalCallback);
|
||||||
wrtChars('-->', 3);
|
wrtChars('-->', 3);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -738,6 +753,15 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TXMLWriter.WriteAttributeString(const Name, Value: XMLString);
|
||||||
|
begin
|
||||||
|
wrtChr(' ');
|
||||||
|
wrtStr(Name);
|
||||||
|
wrtChars('="', 2);
|
||||||
|
ConvWrite(Value, AttrSpecialChars, {$IFDEF FPC}@{$ENDIF}AttrSpecialCharCallback);
|
||||||
|
wrtChr('"');
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitAttribute(Node: TDOMNode);
|
procedure TXMLWriter.VisitAttribute(Node: TDOMNode);
|
||||||
var
|
var
|
||||||
Child: TDOMNode;
|
Child: TDOMNode;
|
||||||
@ -760,31 +784,34 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLWriter.VisitDocumentType(Node: TDOMNode);
|
procedure TXMLWriter.VisitDocumentType(Node: TDOMNode);
|
||||||
|
begin
|
||||||
|
WriteDocType(Node.NodeName, TDOMDocumentType(Node).PublicID, TDOMDocumentType(Node).SystemID,
|
||||||
|
TDOMDocumentType(Node).InternalSubset);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TXMLWriter.WriteDocType(const Name, PubId, SysId, Subset: XMLString);
|
||||||
begin
|
begin
|
||||||
wrtStr(FLineBreak);
|
wrtStr(FLineBreak);
|
||||||
wrtStr('<!DOCTYPE ');
|
wrtStr('<!DOCTYPE ');
|
||||||
wrtStr(Node.NodeName);
|
wrtStr(Name);
|
||||||
wrtChr(' ');
|
wrtChr(' ');
|
||||||
with TDOMDocumentType(Node) do
|
if PubId <> '' then
|
||||||
begin
|
begin
|
||||||
if PublicID <> '' then
|
wrtStr('PUBLIC ');
|
||||||
begin
|
wrtQuotedLiteral(PubId);
|
||||||
wrtStr('PUBLIC ');
|
wrtChr(' ');
|
||||||
wrtQuotedLiteral(PublicID);
|
wrtQuotedLiteral(SysId);
|
||||||
wrtChr(' ');
|
end
|
||||||
wrtQuotedLiteral(SystemID);
|
else if SysId <> '' then
|
||||||
end
|
begin
|
||||||
else if SystemID <> '' then
|
wrtStr('SYSTEM ');
|
||||||
begin
|
wrtQuotedLiteral(SysId);
|
||||||
wrtStr('SYSTEM ');
|
end;
|
||||||
wrtQuotedLiteral(SystemID);
|
if Subset <> '' then
|
||||||
end;
|
begin
|
||||||
if InternalSubset <> '' then
|
wrtChr('[');
|
||||||
begin
|
ConvWrite(Subset, LineEndingChars, @TextnodeNormalCallback);
|
||||||
wrtChr('[');
|
wrtChr(']');
|
||||||
ConvWrite(InternalSubset, LineEndingChars, @TextnodeNormalCallback);
|
|
||||||
wrtChr(']');
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
wrtChr('>');
|
wrtChr('>');
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user