views:

1250

answers:

5

Hi, I'm developing in Delphi 7 (personal). I used to use JvSimpleXML for XML handling, but it doesn't seem to handle WideStrings (or does it?!). My whole project uses TntWide... & SpTBXLib for interface so it does handle Unicode very well, I need now to store some settings in files ... So I'm looking for solution or (free) replacement of JvSimpleXML ... any ideas?

Thanks in advance michal

A: 

Affordable but not free, Storage Library @ http://www.deepsoftware.com/rsllib/ will save as XML, INI, Regitry, etc.

Bob S
+3  A: 

You can use ths lastest version of MSXML 6(Microsoft XML Core Services) importing the dll from delphi.

Here is an example of code generated

// *********************************************************************//
// Interface: IXMLDOMDocument
// Flags:     (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID:      {2933BF81-7B36-11D2-B20E-00C04F983E60}
// *********************************************************************//
  IXMLDOMDocument = interface(IXMLDOMNode)
    ['{2933BF81-7B36-11D2-B20E-00C04F983E60}']
    function Get_doctype: IXMLDOMDocumentType; safecall;
    function Get_implementation_: IXMLDOMImplementation; safecall;
    function Get_documentElement: IXMLDOMElement; safecall;
    procedure _Set_documentElement(const DOMElement: IXMLDOMElement); safecall;
    function createElement(const tagName: WideString): IXMLDOMElement; safecall;
    function createDocumentFragment: IXMLDOMDocumentFragment; safecall;
    function createTextNode(const data: WideString): IXMLDOMText; safecall;
    function createComment(const data: WideString): IXMLDOMComment; safecall;
    function createCDATASection(const data: WideString): IXMLDOMCDATASection; safecall;
    function createProcessingInstruction(const target: WideString; const data: WideString): IXMLDOMProcessingInstruction; safecall;
    function createAttribute(const name: WideString): IXMLDOMAttribute; safecall;
    function createEntityReference(const name: WideString): IXMLDOMEntityReference; safecall;
    function getElementsByTagName(const tagName: WideString): IXMLDOMNodeList; safecall;
    function createNode(type_: OleVariant; const name: WideString; const namespaceURI: WideString): IXMLDOMNode; safecall;
    function nodeFromID(const idString: WideString): IXMLDOMNode; safecall;
    function load(xmlSource: OleVariant): WordBool; safecall;
    function Get_readyState: Integer; safecall;
    function Get_parseError: IXMLDOMParseError; safecall;
    function Get_url: WideString; safecall;
    function Get_async: WordBool; safecall;
    procedure Set_async(isAsync: WordBool); safecall;
    procedure abort; safecall;
    function loadXML(const bstrXML: WideString): WordBool; safecall;
    procedure save(destination: OleVariant); safecall;
    function Get_validateOnParse: WordBool; safecall;
    procedure Set_validateOnParse(isValidating: WordBool); safecall;
    function Get_resolveExternals: WordBool; safecall;
    procedure Set_resolveExternals(isResolving: WordBool); safecall;
    function Get_preserveWhiteSpace: WordBool; safecall;
    procedure Set_preserveWhiteSpace(isPreserving: WordBool); safecall;
    procedure Set_onreadystatechange(Param1: OleVariant); safecall;
    procedure Set_ondataavailable(Param1: OleVariant); safecall;
    procedure Set_ontransformnode(Param1: OleVariant); safecall;
    property doctype: IXMLDOMDocumentType read Get_doctype;
    property implementation_: IXMLDOMImplementation read Get_implementation_;
    property documentElement: IXMLDOMElement read Get_documentElement write _Set_documentElement;
    property readyState: Integer read Get_readyState;
    property parseError: IXMLDOMParseError read Get_parseError;
    property url: WideString read Get_url;
    property async: WordBool read Get_async write Set_async;
    property validateOnParse: WordBool read Get_validateOnParse write Set_validateOnParse;
    property resolveExternals: WordBool read Get_resolveExternals write Set_resolveExternals;
    property preserveWhiteSpace: WordBool read Get_preserveWhiteSpace write Set_preserveWhiteSpace;
    property onreadystatechange: OleVariant write Set_onreadystatechange;
    property ondataavailable: OleVariant write Set_ondataavailable;
    property ontransformnode: OleVariant write Set_ontransformnode;
  end;

EDIT

The object TXMLDocument (for delphi 7) located in XMLDoc.pas is a Wrapper of the version MSXML 4 o less.

const
  { GUID's from MSXML2_TLB.pas }
  CLASS_DOMDocument26: TGUID = '{F5078F1B-C551-11D3-89B9-0000F81FE221}';
  CLASS_DOMDocument30: TGUID = '{F5078F32-C551-11D3-89B9-0000F81FE221}';
  CLASS_DOMDocument40: TGUID = '{88D969C0-F192-11D4-A65F-0040963251E5}';

function CreateDOMDocument: IXMLDOMDocument;
begin
  Result := TryObjectCreate([CLASS_DOMDocument40, CLASS_DOMDocument30,
    CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument;
  if not Assigned(Result) then
    raise DOMException.Create(SMSDOMNotInstalled);
end;

From Microsoft site :

MSXML4 was introduced to add features and improve performance but has been superseded by MSXML6. Customers on MSXML4 should look at migrating to MSXML6 as soon as schedule constraints allow.

Bye

RRUZ
You don't have to import the dll, you can use TXMLDocument and set Vendor to MSXML
The_Fox
the object TXMLDocument (for delphi 7) located in XMLDoc.pas is a Wrapper of the version MSXML 4. using the method described above you can use the MSXML version 6.
RRUZ
these wrappers are unavailable in Delphi 7 Personal which I am using. They also produce additional dependencies which I'd like to avoid...
migajek
Rruz, you can get whatever MSXML version you want by assigning a new function to the `MSXmlDom.MSXmlDomDocumentCreate` function pointer. By default, it attempts to load version 4, 3, 2.6, and 1, whichever works first.
Rob Kennedy
Rob already knew, the point I wanted to note is that this option can have access to a newer version of MSXML :)
RRUZ
+1  A: 

TXMLDocument that comes with Delphi handles WideStrings/Unicode just fine. By default it uses the MSXML library mentioned here. It is a DOM like API. See http://delphi.about.com/library/weekly/aa101904a.htm for an example.

Lars Truijens
+1  A: 

Checkout OmniXML. I have started using it instead of msxml. It also gives you the 'FluentXMLBuilder' which is very slick.

Vegar
thanks, it was my choice :)
migajek
A: 

If you need checking against a XSD schema or transformation with XSL, you should check out DIXml.

ErvinS