From cf3fc4bd7797ffda202ede93c0f8a04b83225791 Mon Sep 17 00:00:00 2001 From: ivost Date: Tue, 16 Sep 2008 22:35:57 +0000 Subject: [PATCH] * added several new helper functions to libxml2 (xmlxsd.pas) git-svn-id: trunk@11796 - --- packages/libxml/src/libxml2.pas | 2 +- packages/libxml/src/xmlstring.inc | 2 +- packages/libxml/src/xmlxsd.pas | 679 +++++++++++++++++++++++++++--- 3 files changed, 620 insertions(+), 63 deletions(-) diff --git a/packages/libxml/src/libxml2.pas b/packages/libxml/src/libxml2.pas index 9d1aa497f8..18bcf024ec 100644 --- a/packages/libxml/src/libxml2.pas +++ b/packages/libxml/src/libxml2.pas @@ -427,7 +427,7 @@ end; function htmlElementAllowedHereDesc(parent: htmlElemDescPtr; elt: htmlElemDescPtr): cint; begin - Result := htmlElementAllowedHere(parent, elt^.name); + Result := htmlElementAllowedHere(parent, BAD_CAST(elt^.name)); end; function htmlRequiredAttrs(elt: htmlElemDescPtr): ppchar; diff --git a/packages/libxml/src/xmlstring.inc b/packages/libxml/src/xmlstring.inc index c6f631dc9e..88e195768a 100644 --- a/packages/libxml/src/xmlstring.inc +++ b/packages/libxml/src/xmlstring.inc @@ -9,7 +9,7 @@ *) {$IFDEF POINTER} - xmlCharPtr = pointer; + xmlCharPtr = ^xmlChar; xmlCharPtrPtr = ^xmlCharPtr; {$ENDIF} diff --git a/packages/libxml/src/xmlxsd.pas b/packages/libxml/src/xmlxsd.pas index f42b7c324a..f7d2beee88 100644 --- a/packages/libxml/src/xmlxsd.pas +++ b/packages/libxml/src/xmlxsd.pas @@ -7,13 +7,17 @@ interface uses libxml2, + DateUtils, SysUtils; { Format functions } function xsdFormatBoolean(Value: Boolean): String; function xsdFormatDate(Year, Month, Day: Longword): String; -function xsdFormatTime(Daytime: Longword): String; -function xsdFormatDateTime(Year, Month, Day, Daytime: Longword): String; +function xsdFormatDate(Date: TDateTime): String; +function xsdFormatTime(Hour, Minute, Second: Longword): String; +function xsdFormatTime(Time: TDateTime): String; +function xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second: Longword): String; +function xsdFormatDateTime(DateTime: TDateTime): String; function xsdFormatDecimal(Value: Extended; Precision: Integer = 4; Digits: Integer = 1): String; function xsdFormatDouble(Value: Double): String; function xsdFormatFloat(Value: Single): String; @@ -27,10 +31,11 @@ function xsdFormatUnsignedInt(Value: Longword): String; function xsdFormatUnsignedLong(Value: QWord): String; { Node creation functions } +function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlNodePtr; function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlNodePtr; function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlNodePtr; -function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Daytime: Longword): xmlNodePtr; -function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Daytime: Longword): xmlNodePtr; +function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlNodePtr; +function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlNodePtr; function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlNodePtr; function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr; function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr; @@ -44,10 +49,11 @@ function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharP function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr; { Property creation functions } +function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlAttrPtr; function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlAttrPtr; function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlAttrPtr; -function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Daytime: Longword): xmlAttrPtr; -function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Daytime: Longword): xmlAttrPtr; +function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlAttrPtr; +function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlAttrPtr; function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer = 4; Digits: Integer = 1): xmlAttrPtr; function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr; function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr; @@ -60,6 +66,59 @@ function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPt function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr; function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr; +{ Query functions } +const + NS_IGNORE : xmlCharPtr = nil; + NS_EXCLUDE : xmlCharPtr = pointer(-1); + +{ Node query functions } +function xsdHasChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer = 0): xmlNodePtr; +function xsdHasNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer = 0): xmlNodePtr; +function xsdGetChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer = 0): xmlCharPtr; +function xsdGetNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer = 0): xmlCharPtr; +function xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String; index: Integer = 0): String; +function xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean; index: Integer = 0): Boolean; +function xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime; +function xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime; +function xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer = 0): TDateTime; +function xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended; index: Integer = 0): Extended; +function xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double; index: Integer = 0): Double; +function xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single; index: Integer = 0): Single; +function xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint; index: Integer = 0): Shortint; +function xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint; index: Integer = 0): Smallint; +function xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint; index: Integer = 0): Longint; +function xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64; index: Integer = 0): Int64; +function xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte; index: Integer = 0): Byte; +function xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word; index: Integer = 0): Word; +function xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword; index: Integer = 0): Longword; +function xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord; index: Integer = 0): QWord; +function xsdGetChildEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string; index: Integer = 0): Integer; + +{ Property query functions } +function xsdHasProp(node: xmlNodePtr; name: xmlCharPtr): xmlAttrPtr; +function xsdHasNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr; +function xsdGetProp(node: xmlNodePtr; name: xmlCharPtr): xmlCharPtr; +function xsdGetNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr; +function xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String): String; +function xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean): Boolean; +function xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +function xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +function xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +function xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended): Extended; +function xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double): Double; +function xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single): Single; +function xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint): Shortint; +function xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint): Smallint; +function xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint): Longint; +function xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64): Int64; +function xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte): Byte; +function xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word): Word; +function xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword): Longword; +function xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord): QWord; +function xsdGetPropEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string): Integer; + +function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: string): boolean; + implementation function xsdFormatBoolean(Value: Boolean): String; @@ -75,34 +134,40 @@ begin Result := Format('%4.4d-%2.2d-%2.2dZ', [Year, Month, Day]); end; -function xsdFormatTime(Daytime: Longword): String; +function xsdFormatDate(Date: TDateTime): String; var - Hour, Minute, Second: Longword; + Year, Month, Day: Word; begin - Daytime := Daytime div 1000; // ms to sec - Second := Daytime mod 60; // extract sec - Daytime := Daytime div 60; // sec to min - Minute := Daytime mod 60; // extract min - Daytime := Daytime div 60; // min to hour - Hour := Daytime mod 60; // extract hour + DecodeDate(Date, Year, Month, Day); + Result := xsdFormatDate(Year, Month, Day); +end; +function xsdFormatTime(Hour, Minute, Second: Longword): String; +begin Result := Format('%2.2d:%2.2d:%2.2dZ', [Hour, Minute, Second]); end; -function xsdFormatDateTime(Year, Month, Day, Daytime: Longword): String; +function xsdFormatTime(Time: TDateTime): String; var - Hour, Minute, Second: Longword; + Hour, Minute, Second, Millisecond: Word; begin - Daytime := Daytime div 1000; // ms to sec - Second := Daytime mod 60; // extract sec - Daytime := Daytime div 60; // sec to min - Minute := Daytime mod 60; // extract min - Daytime := Daytime div 60; // min to hour - Hour := Daytime mod 60; // extract hour + DecodeTime(Time, Hour, Minute, Second, Millisecond); + Result := xsdFormatTime(Hour, Minute, Second); +end; +function xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second: Longword): String; +begin Result := Format('%4.4d-%2.2d-%2.2dT%2.2d:%2.2d:%2.2dZ', [Year, Month, Day, Hour, Minute, Second]); end; +function xsdFormatDateTime(DateTime: TDateTime): String; +var + Year, Month, Day, Hour, Minute, Second, Millisecond: Word; +begin + DecodeDateTime(DateTime, Year, Month, Day, Hour, Minute, Second, Millisecond); + Result := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second); +end; + function xsdFormatDecimal(Value: Extended; Precision: Integer; Digits: Integer): String; begin Result := FloatToStrF(Value, ffFixed, Precision, Digits); @@ -158,20 +223,25 @@ begin Result := IntToStr(Value); end; +function xsdNewChildString(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlNodePtr; +begin + Result := xmlNewChild(parent, ns, name, BAD_CAST(Value)); +end; + function xsdNewChildBoolean(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlNodePtr; var Tmp: String; begin Tmp := xsdFormatBoolean(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; -function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Daytime: Longword): xmlNodePtr; +function xsdNewChildTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlNodePtr; var Tmp: String; begin - Tmp := xsdFormatTime(Daytime); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Tmp := xsdFormatTime(Hour, Minute, Second); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildDate(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlNodePtr; @@ -179,15 +249,15 @@ var Tmp: String; begin Tmp := xsdFormatDate(Year, Month, Day); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; -function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Daytime: Longword): xmlNodePtr; +function xsdNewChildDateTime(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlNodePtr; var Tmp: String; begin - Tmp := xsdFormatDateTime(Year, Month, Day, Daytime); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildDecimal(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlNodePtr; @@ -195,7 +265,7 @@ var Tmp: String; begin Tmp := xsdFormatDecimal(Value, Precision, Digits); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildDouble(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlNodePtr; @@ -203,7 +273,7 @@ var Tmp: String; begin Tmp := xsdFormatDouble(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildFloat(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlNodePtr; @@ -211,7 +281,7 @@ var Tmp: String; begin Tmp := xsdFormatFloat(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlNodePtr; @@ -219,7 +289,7 @@ var Tmp: String; begin Tmp := xsdFormatByte(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlNodePtr; @@ -227,7 +297,7 @@ var Tmp: String; begin Tmp := xsdFormatShort(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlNodePtr; @@ -235,7 +305,7 @@ var Tmp: String; begin Tmp := xsdFormatInt(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlNodePtr; @@ -243,7 +313,7 @@ var Tmp: String; begin Tmp := xsdFormatLong(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildUnsignedByte(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlNodePtr; @@ -251,7 +321,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedByte(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildUnsignedShort(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlNodePtr; @@ -259,7 +329,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedShort(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildUnsignedInt(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlNodePtr; @@ -267,7 +337,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedInt(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; function xsdNewChildUnsignedLong(parent: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlNodePtr; @@ -275,25 +345,28 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedLong(Value); - Result := xmlNewChild(parent, ns, name, PChar(Tmp)); + Result := xmlNewChild(parent, ns, name, BAD_CAST(Tmp)); end; - +function xsdNewPropString(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: String): xmlAttrPtr; +begin + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Value)); +end; function xsdNewPropBoolean(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Boolean): xmlAttrPtr; var Tmp: String; begin Tmp := xsdFormatBoolean(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; -function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Daytime: Longword): xmlAttrPtr; +function xsdNewPropTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Hour, Minute, Second: Longword): xmlAttrPtr; var Tmp: String; begin - Tmp := xsdFormatTime(Daytime); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Tmp := xsdFormatTime(Hour, Minute, Second); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropDate(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day: Longword): xmlAttrPtr; @@ -301,15 +374,15 @@ var Tmp: String; begin Tmp := xsdFormatDate(Year, Month, Day); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; -function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Daytime: Longword): xmlAttrPtr; +function xsdNewPropDateTime(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Year, Month, Day, Hour, Minute, Second: Longword): xmlAttrPtr; var Tmp: String; begin - Tmp := xsdFormatDateTime(Year, Month, Day, Daytime); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Tmp := xsdFormatDateTime(Year, Month, Day, Hour, Minute, Second); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropDecimal(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Extended; Precision: Integer; Digits: Integer): xmlAttrPtr; @@ -317,7 +390,7 @@ var Tmp: String; begin Tmp := xsdFormatDecimal(Value, Precision, Digits); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropDouble(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Double): xmlAttrPtr; @@ -325,7 +398,7 @@ var Tmp: String; begin Tmp := xsdFormatDouble(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropFloat(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Single): xmlAttrPtr; @@ -333,7 +406,7 @@ var Tmp: String; begin Tmp := xsdFormatFloat(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Shortint): xmlAttrPtr; @@ -341,7 +414,7 @@ var Tmp: String; begin Tmp := xsdFormatByte(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Smallint): xmlAttrPtr; @@ -349,7 +422,7 @@ var Tmp: String; begin Tmp := xsdFormatShort(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longint): xmlAttrPtr; @@ -357,7 +430,7 @@ var Tmp: String; begin Tmp := xsdFormatInt(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Int64): xmlAttrPtr; @@ -365,7 +438,7 @@ var Tmp: String; begin Tmp := xsdFormatLong(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropUnsignedByte(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Byte): xmlAttrPtr; @@ -373,7 +446,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedByte(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropUnsignedShort(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Word): xmlAttrPtr; @@ -381,7 +454,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedShort(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropUnsignedInt(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: Longword): xmlAttrPtr; @@ -389,7 +462,7 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedInt(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); end; function xsdNewPropUnsignedLong(node: xmlNodePtr; ns: xmlNsPtr; name: xmlCharPtr; Value: QWord): xmlAttrPtr; @@ -397,7 +470,491 @@ var Tmp: String; begin Tmp := xsdFormatUnsignedLong(Value); - Result := xmlNewNsProp(node, ns, name, PChar(Tmp)); + Result := xmlNewNsProp(node, ns, name, BAD_CAST(Tmp)); +end; + +function xsdHasChild(node: xmlNodePtr; name: xmlCharPtr; index: integer): xmlNodePtr; +begin + Result := xsdHasNsChild(node, name, nil, index); +end; + +function xsdHasNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: integer): xmlNodePtr; +begin + if Assigned(node) and (Index >= 0) then + begin + node := node^.children; + while Assigned(node) do + begin + if (xmlStrEqual(name, node^.name) <> 0) and ((nameSpace = NS_IGNORE) or + ((nameSpace = NS_EXCLUDE) and (node^.ns = nil)) or + ((nameSpace <> NS_EXCLUDE) and (nameSpace <> NS_IGNORE) and (node^.ns <> nil) and (xmlStrEqual(nameSpace, node^.ns^.prefix) <> 0))) then + begin + if index = 0 then + begin + result := node; + Exit; + end; + Dec(Index); + end; + node := node^.next; + end; + end; + + Result := nil; +end; + +function xsdGetChild(node: xmlNodePtr; name: xmlCharPtr; index: Integer): xmlCharPtr; +begin + Result := xsdGetNsChild(node, name, nil, index); +end; + +function xsdGetNsChild(node: xmlNodePtr; name, nameSpace: xmlCharPtr; index: Integer): xmlCharPtr; +var + child: xmlNodePtr; +begin + child := xsdHasNsChild(node, name, nameSpace, index); + if Assigned(child) then + result := xmlNodeGetContent(child) + else + result := nil; +end; + +function xsdGetChildString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String; index: Integer): String; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := pchar(value) + else + result := defaultValue; +end; + +function xsdGetChildBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean; index: Integer): Boolean; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToBoolDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + {if assigned(value) then + result := StrToBoolDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetChildTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + {if assigned(value) then + result := StrToBoolDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetChildDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime; index: Integer): TDateTime; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + {if assigned(value) then + result := StrToBoolDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetChildDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended; index: Integer): Extended; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double; index: Integer): Double; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single; index: Integer): Single; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint; index: Integer): Shortint; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint; index: Integer): Smallint; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint; index: Integer): Longint; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64; index: Integer): Int64; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte; index: Integer): Byte; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word; index: Integer): Word; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword; index: Integer): Longword; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetChildUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord; index: Integer): QWord; +var + value: xmlCharPtr; +begin + value := xsdGetNsChild(node, name, nameSpace, index); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function IndexOfString(const S: String; const List: array of String): Integer; +var + I: Integer; +begin + for I := 0 to Length(List) - 1 do + if List[I] = S then + Exit(I); + Result := -1; +end; + +function xsdGetChildEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string; index: Integer = 0): Integer; +begin + Result := IndexOfString(xsdGetChildString(node, name, nameSpace, Values[0], index), Values); +end; + +function xsdHasProp(node: xmlNodePtr; name: xmlCharPtr): xmlAttrPtr; +begin + result := xsdHasNsProp(node, name, nil); +end; + +function xsdHasNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlAttrPtr; +begin + if nameSpace = NS_EXCLUDE then + begin + result := xmlHasProp(node, name); + if Assigned(result) and (result^.ns <> nil) then + result := nil; + end else + result := xmlHasNsProp(node, name, nameSpace); +end; + +function xsdGetProp(node: xmlNodePtr; name: xmlCharPtr): xmlCharPtr; +begin + result := xmlGetProp(node, name); +end; + +function xsdGetNsProp(node: xmlNodePtr; name, nameSpace: xmlCharPtr): xmlCharPtr; +begin + if nameSpace = NS_EXCLUDE then + result := xmlGetNoNsProp(node, name) + else + result := xmlGetNsProp(node, name, nameSpace); +end; + +function xsdGetPropString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: String): String; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := pchar(value) + else + result := defaultValue; +end; + +function xsdGetPropBoolean(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Boolean): Boolean; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToBoolDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropDate(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +var + value: xmlCharPtr; +begin + {value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetPropTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +var + value: xmlCharPtr; +begin + {value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetPropDateTime(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: TDateTime): TDateTime; +var + value: xmlCharPtr; +begin + {value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else} + result := defaultValue; +end; + +function xsdGetPropDecimal(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Extended): Extended; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropDouble(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Double): Double; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropFloat(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Single): Single; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToFloatDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Shortint): Shortint; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Smallint): Smallint; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longint): Longint; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Int64): Int64; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropUnsignedByte(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Byte): Byte; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropUnsignedShort(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Word): Word; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropUnsignedInt(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: Longword): Longword; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropUnsignedLong(node: xmlNodePtr; name, nameSpace: xmlCharPtr; defaultValue: QWord): QWord; +var + value: xmlCharPtr; +begin + value := xsdGetNsProp(node, name, nameSpace); + if assigned(value) then + result := StrToIntDef(pchar(value), defaultValue) + else + result := defaultValue; +end; + +function xsdGetPropEnumString(node: xmlNodePtr; name, nameSpace: xmlCharPtr; Values: array of string): Integer; +begin + result := IndexOfString(xsdGetPropString(node, name, nameSpace, Values[0]), Values); +end; + +function xsdRemoveBlanks(content: xmlCharPtr; out cleaned: string): boolean; +var + Space: Boolean; + len: Integer; +begin + cleaned := ''; + + if Assigned(content) then + begin + Space := True; + + while content^ <> 0 do + begin + if xmlIsBlank(content^) then + begin + if not Space then + cleaned := cleaned + ' '; + Space := True; + end else begin + cleaned := cleaned + chr(content^); + Space := False; + end; + + Inc(content); + end; + end; + + len := Length(cleaned); + if len > 0 then + begin + if cleaned[len] = ' ' then + SetLength(cleaned, len-1); + Result := True; + end else + Result := False; end; end. \ No newline at end of file