📄 omnixml.pas
字号:
procedure SetDocumentElement(const Value: IXMLElement);
function GetPreserveWhiteSpace: Boolean;
procedure SetPreserveWhiteSpace(const Value: Boolean);
function GetText: WideString; override;
function GetOwnerDocument: IXMLDocument; override;
protected
FXMLAttrClass: TXMLAttrClass;
FXMLCDATASectionClass: TXMLCDATASectionClass;
FXMLCommentClass: TXMLCommentClass;
FXMLDocTypeClass: TXMLDocumentTypeClass;
FXMLElementClass: TXMLElementClass;
FXMLProcessingInstructionClass: TXMLProcessingInstructionClass;
FXMLTextClass: TXMLTextClass;
// creating new childs
function InternalCreateAttribute(const Name: WideString): TXMLAttr;
function InternalCreateCDATASection(const Data: WideString): TXMLCDATASection;
function InternalCreateComment(const Data: WideString): TXMLComment;
function InternalCreateDocType(const Data: WideString): TXMLDocumentType;
function InternalCreateDocumentFragment: TXMLDocumentFragment;
function InternalCreateElement(const TagName: WideString): TXMLElement;
function InternalCreateEntityReference(const Name: WideString): TXMLEntityReference;
function InternalCreateProcessingInstruction(const Target, Data: WideString): TXMLProcessingInstruction;
function InternalCreateTextNode(const Data: WideString): TXMLText;
// reading / writing support
procedure ReadFromStream(const Parent: TXMLNode; const InputStream: IUnicodeStream); override;
procedure InternalWriteToStream(const OutputStream: IUnicodeStream); override;
public
property DocType: IXMLDocumentType read GetDocType;
property DocumentElement: IXMLElement read GetDocumentElement write SetDocumentElement;
property PreserveWhiteSpace: Boolean read GetPreserveWhiteSpace write SetPreserveWhiteSpace;
constructor Create; virtual;
destructor Destroy; override;
function CreateAttribute(const Name: WideString): IXMLAttr;
function CreateCDATASection(const Data: WideString): IXMLCDATASection;
function CreateComment(const Data: WideString): IXMLComment;
function CreateDocType(const Data: WideString): IXMLDocumentType;
function CreateDocumentFragment: IXMLDocumentFragment;
function CreateElement(const TagName: WideString): IXMLElement;
function CreateEntityReference(const Name: WideString): IXMLEntityReference;
function CreateProcessingInstruction(const Target, Data: WideString): IXMLProcessingInstruction;
function CreateTextNode(const Data: WideString): IXMLText;
function GetElementsByTagName(const TagName: WideString): IXMLNodeList;
function Load(const FileName: string): Boolean; virtual;
function LoadFromStream(const Stream: TStream): Boolean;
procedure Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone); virtual;
procedure SaveToStream(const OutputStream: TStream; const OutputFormat: TOutputFormat = ofNone);
function LoadXML(const XML: WideString): Boolean; virtual;
property ParseError: IXMLParseError read GetParseError;
end;
type
TCodePage = record
CodePage: Word;
Alias: string;
end;
TCodePages = array[1..22] of TCodePage;
const
CodePages: TCodePages = (
(CodePage: 932; Alias: 'shift-jis'), // Japanese (Shift-JIS)
(CodePage: CP_UTF16; Alias: 'utf-16'), // Central European Alphabet (Windows)
(CodePage: 1250; Alias: 'windows-1250'), // Central European Alphabet (Windows)
(CodePage: 1251; Alias: 'windows-1251'), // Cyrillic Alphabet (Windows)
(CodePage: 1252; Alias: 'windows-1252'), // Western Alphabet
(CodePage: 1253; Alias: 'windows-1253'), // Greek Alphabet (Windows)
(CodePage: 1254; Alias: 'windows-1254'), // Turkish Alphabet
(CodePage: 1255; Alias: 'windows-1255'), // Hebrew Alphabet (Windows)
(CodePage: 1256; Alias: 'windows-1256'), // Arabic Alphabet (Windows)
(CodePage: 1257; Alias: 'windows-1257'), // Baltic Alphabet (Windows)
(CodePage: 1258; Alias: 'windows-1258'), // Vietnamese Alphabet (Windows)
(CodePage: ISO_8859_1; Alias: 'iso-8859-1'), // Western Alphabet (ISO)
(CodePage: ISO_8859_2; Alias: 'iso-8859-2'), // Central European Alphabet (ISO)
(CodePage: ISO_8859_3; Alias: 'iso-8859-3'), // Latin 3 Alphabet (ISO)
(CodePage: ISO_8859_4; Alias: 'iso-8859-4'), // Baltic Alphabet (ISO)
(CodePage: ISO_8859_5; Alias: 'iso-8859-5'), // Cyrillic Alphabet (ISO)
(CodePage: ISO_8859_6; Alias: 'iso-8859-6'), // Arabic Alphabet (ISO)
(CodePage: ISO_8859_7; Alias: 'iso-8859-7'), // Greek Alphabet (ISO)
(CodePage: ISO_8859_8; Alias: 'iso-8859-8'), // Hebrew Alphabet (ISO)
(CodePage: 50220; Alias: 'iso-2022-jp'), // Japanese (JIS)
(CodePage: 51932; Alias: 'euc-jp'), // Japanese (EUC)
(CodePage: CP_UTF8; Alias: 'utf-8') // Universal Alphabet (UTF-8)
);
// helper functions
function CreateXMLDoc: IXMLDocument;
// Unicode functions
function UniTrim(const Value: WideString): WideString;
// XML related helper functions
function CharIs_BaseChar(const ch: WideChar): Boolean;
function CharIs_Ideographic(const ch: WideChar): Boolean;
function CharIs_Letter(const ch: WideChar): Boolean;
function CharIs_Extender(const ch: WideChar): Boolean;
function CharIs_Digit(const ch: WideChar): Boolean;
function CharIs_CombiningChar(const ch: WideChar): Boolean;
function CharIs_WhiteSpace(const ch: WideChar): Boolean;
function CharIs_Char(const ch: WideChar): Boolean;
function CharIs_NameChar(const ch: WideChar): Boolean;
function CharIs_Name(const ch: WideChar; const IsFirstChar: Boolean): Boolean;
function EncodeText(const Value: WideString): WideString;
implementation
uses
OmniXML_LookupTables;
const
MAX_OUTPUTBUFFERSIZE = 256; // initial output buffer size (it only stores one tag at once!)
OUTPUT_INDENT = 2;
type
TCharRef = record
Code: Word;
Name: string;
end;
TCharacterReferences = array[1..101] of TCharRef;
var
DOMErrorInfoList: array[INDEX_SIZE_ERR..INUSE_ATTRIBUTE_ERR] of string = (
'Index or size is negative, or greater than the allowed value',
'The specified range of text does not fit into a WideString',
'Any node is inserted somewhere it doesn''t belong',
'A node is used in a different document than the one that created it (that doesn''t support it)',
'An invalid character is specified, such as in a name',
'Data is specified for a node which does not support data',
'An attempt is made to modify an object where modifications are not allowed',
'An attempt was made to reference a node in a context where it does not exist',
'The implementation does not support the type of object requested',
'An attempt is made to add an attribute that is already inuse elsewhere');
type
TErrorInfo = record
ID: Integer;
Text: string;
end;
var
NodeTypeList: array[TNodeType] of String =
('ELEMENT', 'ATTRIBUTE', 'TEXT', 'CDATA_SECTION', 'ENTITY_REFERENCE',
'ENTITY_NODE', 'PROCESSING_INSTRUCTION', 'COMMENT', 'DOCUMENT',
'DOCUMENT_TYPE', 'DOCUMENT_FRAGMENT', 'NOTATION');
var
XMLErrorInfoList: array[MSG_E_NOTEXT..XML_BAD_ENCODING] of TErrorInfo =
( (ID: MSG_E_NOTEXT; Text: '%s'),
(ID: MSG_E_FORMATINDEX_BADINDEX; Text: 'The value passed in to formatIndex needs to be greater than zero.'),
(ID: MSG_E_FORMATINDEX_BADFORMAT; Text: 'Invalid format string.'),
(ID: MSG_E_SYSTEM_ERROR; Text: 'System error: %s.'),
(ID: MSG_E_MISSINGEQUALS; Text: 'Missing equals sign between attribute and attribute value.'),
(ID: MSG_E_EXPECTED_TOKEN; Text: 'Expected token %s found %s.'),
(ID: MSG_E_UNEXPECTED_TOKEN; Text: 'Unexpected token %s.'),
(ID: MSG_E_MISSINGQUOTE; Text: 'A string literal was expected, but no opening quote character was found.'),
(ID: MSG_E_COMMENTSYNTAX; Text: 'Incorrect syntax was used in a comment.'),
(ID: MSG_E_BADSTARTNAMECHAR; Text: 'A name started with an invalid character.'),
(ID: MSG_E_BADNAMECHAR; Text: 'A name contained an invalid character.'),
(ID: MSG_E_BADCHARINSTRING; Text: 'The character "<" cannot be used in an attribute value.'),
(ID: MSG_E_XMLDECLSYNTAX; Text: 'Invalid syntax for an xml declaration.'),
(ID: MSG_E_BADCHARDATA; Text: 'An invalid character was found in text content.'),
(ID: MSG_E_MISSINGWHITESPACE; Text: 'Required white space was missing.'),
(ID: MSG_E_EXPECTINGTAGEND; Text: 'The character ">" was expected.'),
(ID: MSG_E_BADCHARINDTD; Text: 'Invalid character found in DTD.'),
(ID: MSG_E_BADCHARINDECL; Text: 'An invalid character was found inside a DTD declaration.'),
(ID: MSG_E_MISSINGSEMICOLON; Text: 'A semi colon character was expected.'),
(ID: MSG_E_BADCHARINENTREF; Text: 'An invalid character was found inside an entity reference.'),
(ID: MSG_E_UNBALANCEDPAREN; Text: 'Unbalanced parentheses.'),
(ID: MSG_E_EXPECTINGOPENBRACKET; Text: 'An opening "[" character was expected.'),
(ID: MSG_E_BADENDCONDSECT; Text: 'Invalid syntax in a conditional section.'),
(ID: MSG_E_INTERNALERROR; Text: 'Internal error: %s'),
(ID: MSG_E_UNEXPECTED_WHITESPACE; Text: 'Whitespace is not allowed at this location.'),
(ID: MSG_E_INCOMPLETE_ENCODING; Text: 'End of file reached in invalid state for current encoding.'),
(ID: MSG_E_BADCHARINMIXEDMODEL; Text: 'Mixed content model cannot contain this character.'),
(ID: MSG_E_MISSING_STAR; Text: 'Mixed content model must be defined as zero or more("*").'),
(ID: MSG_E_BADCHARINMODEL; Text: 'Invalid character in content model.'),
(ID: MSG_E_MISSING_PAREN; Text: 'Missing parenthesis.'),
(ID: MSG_E_BADCHARINENUMERATION; Text: 'Invalid character found in ATTLIST enumeration.'),
(ID: MSG_E_PIDECLSYNTAX; Text: 'Invalid syntax in processing instruction declaration.'),
(ID: MSG_E_EXPECTINGCLOSEQUOTE; Text: 'A single or double closing quote character ('' or ") is missing.'),
(ID: MSG_E_MULTIPLE_COLONS; Text: 'Multiple colons are not allowed in a name.'),
(ID: MSG_E_INVALID_DECIMAL; Text: 'Invalid character for decimal digit.'),
(ID: MSG_E_INVALID_HEXADECIMAL; Text: 'Invalid character for hexadecimal digit.'),
(ID: MSG_E_INVALID_UNICODE; Text: 'Invalid Unicode character value for this platform.'),
(ID: MSG_E_WHITESPACEORQUESTIONMARK; Text: 'Expecting white space or "?".'),
(ID: MSG_E_SUSPENDED; Text: 'The parser is suspended.'),
(ID: MSG_E_STOPPED; Text: 'The parser is stopped.'),
(ID: MSG_E_UNEXPECTEDENDTAG; Text: 'End tag was not expected at this location.'),
(ID: MSG_E_UNCLOSEDTAG; Text: 'The following tags were not closed: %s.'),
(ID: MSG_E_DUPLICATEATTRIBUTE; Text: 'Duplicate attribute.'),
(ID: MSG_E_MULTIPLEROOTS; Text: 'Only one top level element is allowed in an XML document.'),
(ID: MSG_E_INVALIDATROOTLEVEL; Text: 'Invalid character at the top level of the document.'),
(ID: MSG_E_BADXMLDECL; Text: 'Invalid XML declaration.'),
(ID: MSG_E_MISSINGROOT; Text: 'XML document must have a top level element.'),
(ID: MSG_E_UNEXPECTEDEOF; Text: 'Unexpected end of file.'),
(ID: MSG_E_BADPEREFINSUBSET; Text: 'Parameter entities cannot be used inside markup declarations in an internal subset.'),
(ID: MSG_E_PE_NESTING; Text: 'The replacement text for a parameter entity must be properly nested with parenthesized groups.'),
(ID: MSG_E_INVALID_CDATACLOSINGTAG; Text: 'The literal string "]]>" is not allowed in element content.'),
(ID: MSG_E_UNCLOSEDPI; Text: 'Processing instruction was not closed.'),
(ID: MSG_E_UNCLOSEDSTARTTAG; Text: 'Element was not closed.'),
(ID: MSG_E_UNCLOSEDENDTAG; Text: 'End element was missing the character ">".'),
(ID: MSG_E_UNCLOSEDSTRING; Text: 'A string literal was not closed.'),
(ID: MSG_E_UNCLOSEDCOMMENT; Text: 'A comment was not closed.'),
(ID: MSG_E_UNCLOSEDDECL; Text: 'A declaration was not closed.'),
(ID: MSG_E_UNCLOSEDMARKUPDECL; Text: 'A markup declaration was not closed.'),
(ID: MSG_E_UNCLOSEDCDATA; Text: 'A CDATA section was not closed.'),
(ID: MSG_E_BADDECLNAME; Text: 'Declaration has an invalid name.'),
(ID: MSG_E_BADEXTERNALID; Text: 'External ID is invalid.'),
(ID: MSG_E_BADELEMENTINDTD; Text: 'An XML element is not allowed inside a DTD.'),
(ID: MSG_E_RESERVEDNAMESPACE; Text: 'The namespace prefix is not allowed to start with the reserved string "xml".'),
(ID: MSG_E_EXPECTING_VERSION; Text: 'The version attribute is required at this location.'),
(ID: MSG_E_EXPECTING_ENCODING; Text: 'The encoding attribute is required at this location.'),
(ID: MSG_E_EXPECTING_NAME; Text: 'At least one name is required at this location.'),
(ID: MSG_E_UNEXPECTED_ATTRIBUTE; Text: 'The specified attribute was not expected at this location. The attribute may be case-sensitive.'),
(ID: MSG_E_ENDTAGMISMATCH; Text: 'End tag %s does not match the start tag %s.'),
(ID: MSG_E_INVALIDENCODING; Text: 'System does not support the specified encoding.'),
(ID: MSG_E_INVALIDSWITCH; Text: 'Switch from current encoding to specified encoding not supported.'),
(ID: MSG_E_EXPECTING_NDATA; Text: 'NDATA keyword is missing.'),
(ID: MSG_E_INVALID_MODEL; Text: 'Content model is invalid.'),
(ID: MSG_E_INVALID_TYPE; Text: 'Invalid type defined in ATTLIST.'),
(ID: MSG_E_INVALIDXMLSPACE; Text: 'XML space attribute has invalid value. Must specify "default" or "preserve".'),
(ID: MSG_E_MULTI_ATTR_VALUE; Text: 'Multiple names found in attribute value when only one was expected.'),
(ID: MSG_E_INVALID_PRESENCE; Text: 'Invalid ATTDEF declaration. Expected #REQUIRED, #IMPLIED, or #FIXED.'),
(ID: MSG_E_BADXMLCASE; Text: 'The name "xml" is reserved and must be lowercase.'),
(ID: MSG_E_CONDSECTINSUBSET; Text: 'Conditional sections are not allowed in an internal subset.'),
(ID: MSG_E_CDATAINVALID; Text: 'CDATA is not allowed in a DTD.'),
(ID: MSG_E_INVALID_STANDALONE; Text: 'The standalone attribute must have the value "yes" or "no".'),
(ID: MSG_E_UNEXPECTED_STANDALONE; Text: 'The standalone attribute cannot be used in external entities.'),
(ID: MSG_E_DOCTYPE_IN_DTD; Text: 'Cannot have a DOCTYPE declaration in a DTD.'),
(ID: MSG_E_MISSING_ENTITY; Text: 'Reference to an undefined entity.'),
(ID: MSG_E_ENTITYREF_INNAME; Text: 'Entity reference is resolved to an invalid name character.'),
(ID: MSG_E_DOCTYPE_OUTSIDE_PROLOG; Text: 'Cannot have a DOCTYPE declaration outside of a prolog.'),
(ID: MSG_E_INVALID_VERSION; Text: 'Invalid version number.'),
(ID: MSG_E_DTDELEMENT_OUTSIDE_DTD; Text: 'Cannot have a DTD declaration outside of a DTD.'),
(ID: MSG_E_DUPLICATEDOCTYPE; Text: 'Cannot have multiple DOCTYPE declarations.'),
(ID: MSG_E_RESOURCE; Text: 'Error processing resource %s.'),
(ID: MSG_E_INVALID_OPERATION; Text: 'This operation can not be performed with a Node of type %s.'),
(ID: XML_IOERROR; Text: 'Error opening input file: ''%s''.'),
(ID: XML_ENTITY_UNDEFINED; Text: 'Reference to undefined entity %s.'),
(ID: XML_INFINITE_ENTITY_LOOP; Text: 'Entity %s contains an infinite entity reference loop.'),
(ID: XML_NDATA_INVALID_PE; Text: 'Cannot use the NDATA keyword in a parameter entity declaration.'),
(ID: XML_REQUIRED_NDATA; Text: 'Cannot use a general parsed entity ''%s'' as the value for attribute ''%s''.'),
(ID: XML_NDATA_INVALID_REF; Text: 'Cannot use unparsed entity %s in an entity reference.'),
(ID: XML_EXTENT_IN_ATTR; Text: 'Cannot reference an external general parsed entity %s in an attribute value.'),
(ID: XML_STOPPED_BY_USER; Text: 'XML parser stopped by user.'),
(ID: XML_PARSING_ENTITY; Text: 'Error while parsing entity %s. %s.'),
(ID: XML_E_MISSING_PE_ENTITY; Text: 'Parameter entity must be defined before it is used.'),
(ID: XML_E_MIXEDCONTENT_DUP_NAME; Text: 'The same name must not appear more than once in a single mixed-content declaration: %s.'),
(ID: XML_NAME_COLON; Text: 'Entity, EntityRef, PI, Notation names, or NMToken cannot contain a colon.'),
(ID: XML_ELEMENT_UNDECLARED; Text: 'The element %s is used but not declared in the DTD/Schema.'),
(ID: XML_ELEMENT_ID_NOT_FOUND; Text: 'The attribute %s references the ID %s, which is not defined anywhere in the document.'),
(ID: XML_DEFAULT_ATTRIBUTE; Text: 'Error in the default attribute value defined in DTD/Schema.'),
(ID: XML_XMLNS_RESERVED; Text: 'Reserved namespace "%s" cannot be redeclared.'),
(ID: XML_EMPTY_NOT_ALLOWED; Text: 'Element cannot be empty according to the DTD/Schema.'),
(ID: XML_ELEMENT_NOT_COMPLETE; Text: 'Element content is incomplete according to the DTD/Schema.'),
(ID: XML_ROOT_NAME_MISMATCH; Text: 'The name of the top-most element must match the name of the DOCTYPE declaration.'),
(ID: XML_INVALID_CONTENT; Text: 'Element content is invalid according to the DTD/Schema.'),
(ID: XML_ATTRIBUTE_NOT_DEFINED; Text: 'The attribute %s on this element is not defined in the DTD/Schema.'),
(ID: XML_ATTRIBUTE_FIXED; Text: 'Attribute %s has a value which does not match the fixed value defined in the DTD/Schema.'),
(ID: XML_ATTRIBUTE_VALUE; Text: 'Attribute %s has an invalid value according to the DTD/Schema.'),
(ID: XML_ILLEGAL_TEXT; Text: 'Text is not allowed in this element according to the DTD/Schema.'),
(ID: XML_MULTI_FIXED_VALUES; Text: 'An attribute declaration cannot contain multiple fixed values: "%s".'),
(ID: XML_NOTATION_DEFINED; Text: 'The notation %s is already declared.'),
(ID: XML_ELEMENT_DEFINED; Text: 'The element %s is already declared.'),
(ID: XML_ELEMENT_UNDEFINED; Text: 'Reference to undeclared element: %s.'),
(ID: XML_XMLNS_UNDEFINED; Text: 'Reference to undeclared namespace prefix: %s.'),
(ID: XML_XMLNS_FIXED; Text: 'Attribute %s must be a #FIXED attribute.'),
(ID: XML_E_UNKNOWNERROR; Text: 'Unknown error: %s.'),
(ID: XML_REQUIRED_ATTRIBUTE_MISSING; Text: 'Required attribute %s is missing.'),
(ID: XML_MISSING_NOTATION; Text: 'Declaration %s contains a reference to undefined notation %s.'),
(ID: XML_ATTLIST_DUPLICATED_ID; Text: 'Cannot define multiple ID attributes on the same element.'),
(ID: XML_ATTLIST_ID_PRESENCE; Text: 'An attribute of type ID must have a declared default of #IMPLIED or #REQUIRED.'),
(ID: XML_XMLLANG_INVALIDID; Text: 'The language ID %s is invalid.'),
(ID: XML_PUBLICID_INVALID; Text: 'The public ID %s is invalid.'),
(ID: XML_DTD_EXPECTING; Text: 'Expecting: %s.'),
(ID: XML_NAMESPACE_URI_EMPTY; Text: 'Only a default namespace can have an empty URI.'),
(ID: XML_LOAD_EXTERNALENTITY; Text: 'Could not load %s.'),
(ID: XML_BAD_ENCODING; Text: 'Unable to save character to %s encoding.') );
var
CharacterReferences: TCharacterReferences = (
(Code: 34; Name: 'quot'),
(Code: 38; Name: 'amp'),
(Code: 39; Name: 'apos'),
(Code: 60; Name: 'lt'),
(Code: 62; Name: 'gt'),
(Code: 160; Name: 'nbsp'),
(Code: 161; Name: 'iexcl'),
(Code: 162; Name: 'cent'),
(Code: 163; Name: 'pound'),
(Code: 164; Name: 'curren'),
(Code: 165; Name: 'yen'),
(Code: 166; Name: 'brvbar'),
(Code: 167; Name: 'sect'),
(Code: 168; Name: 'uml'),
(Code: 169; Name: 'copy'),
(Code: 170; Name: 'ordf'),
(Code: 171; Name: 'laquo'),
(Code: 172; Name: 'not'),
(Code: 173; Name: 'shy'),
(Code: 174; Name: 'reg'),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -