PT_MSXML3

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

PT_MSXML3

Beitrag von Kiffi »

Hallo,

wie bereits angesprochen: hier ist der Code zu meiner PT_MSXML3-Lib.
Dieser kann somit als Include eingebunden werden.

Wichtig: Wenn der Code als Include verwendet wird, dann vor dem
ersten Aufruf einer Funktion unbedingt PT_MSXML3_Init() aufrufen. Nach
Aufruf der letzten Funktion ist PT_MSXML3_End() aufzurufen.

Wenn im Code eklatante Fehler entdeckt werden, so wäre es schön, wenn
man mich darauf hinweisen würde, damit ich diesen dann hier korrigieren
kann. Für konstruktive Kritik bin ich natürlich offen.

Edit: Hier ist die gezippte Version des Codes herunterladbar: http://www.b-4-b.de/pt_msxml3_src.zip

Grüße ... Kiffi

Code: Alles auswählen

;- Interface definitions

Interface myIXMLDOMNode Extends IDispatch
  get_nodeName(a.l) ; 
  get_nodeValue(a.l) ; 
  put_nodeValue(a.l) ; 
  get_nodeType(a.l) ; 
  get_parentNode(a.l) ; 
  get_childNodes(a.l) ; 
  get_firstChild(a.l) ; 
  get_lastChild(a.l) ; 
  get_previousSibling(a.l) ; 
  get_nextSibling(a.l) ; 
  get_attributes(a.l) ; 
  ; insertBefore(a.l,b.l,c.l) ; 
  insertBefore(a.l,b.l,c.l,d.l,e.l,f.l) ; 
  replaceChild(a.l,b.l,c.l) ; 
  removeChild(a.l,b.l) ; 
  appendChild(a.l,b.l) ; 
  hasChildNodes(a.l) ; 
  get_ownerDocument(a.l) ; 
  cloneNode(a.l,b.l) ; 
  get_nodeTypeString(a.l) ; 
  get_text(a.l) ; 
  put_text(a.l) ; 
  get_specified(a.l) ; 
  get_definition(a.l) ; 
  get_nodeTypedValue(a.l) ; 
  put_nodeTypedValue(a.l) ; 
  get_dataType(a.l) ; 
  put_dataType(a.l) ; 
  get_xml(a.l) ; 
  transformNode(a.l,b.l) ; 
  selectNodes(a.l,b.l) ; 
  selectSingleNode(a.l,b.l) ; 
  get_parsed(a.l) ; 
  get_namespaceURI(a.l) ; 
  get_prefix(a.l) ; 
  get_baseName(a.l) ; 
  transformNodeToObject(a.l,b.l) ; 
EndInterface

Interface myIXMLDOMNodeList Extends IDispatch
  get_item(a.l,b.l) ; 
  get_length(a.l) ; 
  nextNode(a.l) ; 
  reset() ; 
  get__newEnum(a.l) ; 
EndInterface

Interface myIXMLDOMDocument Extends myIXMLDOMNode
  get_doctype(a.l) ; 
  get_implementation(a.l) ; 
  get_documentElement(a.l) ; 
  put_documentElement(a.l) ; 
  createElement(a.l,b.l) ; 
  createDocumentFragment(a.l) ; 
  createTextNode(a.l,b.l) ; 
  createComment(a.l,b.l) ; 
  createCDATASection(a.l,b.l) ; 
  createProcessingInstruction(a.l,b.l,c.l) ; 
  createAttribute(a.l,b.l) ; 
  createEntityReference(a.l,b.l) ; 
  getElementsByTagName(a.l,b.l) ; 
  createNode(a.l,b.l,c.l,d.l,e.l,f.l,g.l) ; 
  ;createNode(a.l,b.l,c.l,d.l) ; 
  nodeFromID(a.l,b.l) ; 
  load(a.l,a.l,a.l,a.l,b.l) ; I changed this method to pass a VARIANT to it 
  get_readyState(a.l) ; 
  get_parseError(a.l) ; 
  get_url(a.l) ; 
  get_async(a.l) ; 
  put_async(a.l) ; 
  abort() ; 
  loadXML(a.l, b.l) ;
  save(a.l,a.l,a.l,a.l) ; I changed this method to pass a VARIANT to it 
  get_validateOnParse(a.l) ; 
  put_validateOnParse(a.l) ; 
  get_resolveExternals(a.l) ; 
  put_resolveExternals(a.l) ; 
  get_preserveWhiteSpace(a.l) ; 
  put_preserveWhiteSpace(a.l) ; 
  put_onreadystatechange(a.l) ; 
  put_ondataavailable(a.l) ; 
  put_ontransformnode(a.l) ; 
EndInterface

Interface myIXMLDOMParseError Extends IDispatch
  get_errorCode(a.l) ; 
  get_url(a.l) ; 
  get_reason(a.l) ; 
  get_srcText(a.l) ; 
  get_line(a.l) ; 
  get_linepos(a.l) ; 
  get_filepos(a.l) ; 
EndInterface

Interface myIXMLDOMNamedNodeMap Extends IDispatch
  getNamedItem(a,b)
  setNamedItem(a,b)
  removeNamedItem(a,b)
  get_item(a,b)
  get_length(a)
  getQualifiedItem(a,b,c)
  removeQualifiedItem(a,b,c)
  nextNode(a)
  reset()
  get__newEnum(a)
EndInterface

Interface myIXMLDOMAttribute Extends myIXMLDOMNode
  get_name(a)
  get_value(a)
  put_value(a,b,c,d)
EndInterface

;#VT_I4.w                = 3
;#VT_DISPATCH.w          = 9

#VT_I4                = 3
#VT_DISPATCH          = 9

; Konstanten für CreateNode
#NODE_ELEMENT                =  1
#NODE_ATTRIBUTE              =  2
#NODE_TEXT                   =  3 
#NODE_CDATA_SECTION          =  4 
#NODE_ENTITY_REFERENCE       =  5 
#NODE_ENTITY                 =  6 
#NODE_PROCESSING_INSTRUCTION =  7 
#NODE_COMMENT                =  8 
#NODE_DOCUMENT               =  9 
#NODE_DOCUMENT_TYPE          = 10 
#NODE_DOCUMENT_FRAGMENT      = 11 
#NODE_NOTATION               = 12 

Global I_IXMLDOMNode.myIXMLDOMNode
Global I_IXMLDOMNodeList.myIXMLDOMNodeList
Global I_IXMLDOMDocument.myIXMLDOMDocument
Global I_IXMLDOMAttribute.myIXMLDOMAttribute
Global I_IXMLDOMAttributes.myIXMLDOMNamedNodeMap

Global I_IXMLDOMDocument_XSL.myIXMLDOMDocument

Global O_IXMLDOMNode.myIXMLDOMNode
Global O_IXMLDOMNodeList.myIXMLDOMNodeList
Global O_IXMLDOMDocument.myIXMLDOMDocument
Global O_IXMLDOMAttribute.myIXMLDOMAttribute
Global O_IXMLDOMAttributes.myIXMLDOMNamedNodeMap

Global O_IXMLDOMParseError.myIXMLDOMParseError

Global LastMessage$
Global ReturnString$

ProcedureDLL   PT_MSXML3_Init()
  ; Do some initializing stuff, allocate memory, etc.
  CoInitialize_(0) 
EndProcedure
ProcedureDLL   PT_MSXML3_End()
  ; Do some cleaning, free memory, unload third party DLLs, etc.
  CoUninitialize_() 
EndProcedure

Procedure.s    PT_MSXML3_Uni2Ansi(unicodestr.l)
  lenA = WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, 0, 0, 0, 0);
  ansistr.s = Space(lenA)
  If (lenA > 0)
    WideCharToMultiByte_(#CP_ACP, 0, unicodestr, -1, @ansistr, lenA, 0, 0);
  EndIf
  ProcedureReturn ansistr
EndProcedure
Procedure.l    PT_MSXML3_Ansi2Uni(ansistr.s)
  lenA.l = Len(ansistr)
  lenW = MultiByteToWideChar_(#CP_ACP, 0, ansistr, lenA, 0, 0)
  If (lenW > 0) ; Check whether conversion was successful
    unicodestr = SysAllocStringLen_(0, lenW)
    MultiByteToWideChar_(#CP_ACP, 0, ansistr, lenA, unicodestr, lenW)
    result = unicodestr
    SysFreeString_(unicodestr)
    ProcedureReturn result
  Else
    ProcedureReturn 0
  EndIf
EndProcedure 
Procedure.s    PT_MSXML3_GetHResultMessage(HResult.l)
  
  ;Converts a COM HResult value into a more meaningful message.
  ;Params: HResult.l A HResult value return from a COM call
  
  Message.s = ""
  Select HResult
    Case #S_OK
      Message = "OK"
    Case #CLASS_E_CLASSNOTAVAILABLE
      Message = "Class Not Available"
    Case #E_NOINTERFACE
      Message = "No Interface"
    Case #CO_E_NOTINITIALIZED
      Message = "CO_E_NOTINITIALIZED"
    Case #CO_E_ALREADYINITIALIZED
      Message = "CO_E_ALREADYINITIALIZED"
    Case #CO_E_CANTDETERMINECLASS
      Message = "CO_E_CANTDETERMINECLASS"
    Case #CO_E_CLASSSTRING
      Message = "The registered CLSID for the ProgID is invalid"
    Case #CO_E_IIDSTRING
      Message = "CO_E_IIDSTRING"
    Case #CO_E_APPNOTFOUND
      Message = "CO_E_APPNOTFOUND"
    Case #CO_E_APPSINGLEUSE
      Message = "CO_E_APPSINGLEUSE"
    Case #CO_E_ERRORINAPP
      Message = "CO_E_ERRORINAPP"
    Case #CO_E_DLLNOTFOUND
      Message = "CO_E_DLLNOTFOUND"
    Case #CO_E_ERRORINDLL
      Message = "CO_E_ERRORINDLL"
    Case #CO_E_WRONGOSFORAPP
      Message = "CO_E_WRONGOSFORAPP"
    Case #CO_E_OBJNOTREG
      Message = "CO_E_OBJNOTREG"
    Case #CO_E_OBJISREG
      Message = "CO_E_OBJISREG"
    Case #CO_E_OBJNOTCONNECTED
      Message = "CO_E_OBJNOTCONNECTED"
    Case #CO_E_APPDIDNTREG
      Message = "CO_E_APPDIDNTREG"
    Case #CO_E_RELEASED
      Message = "CO_E_RELEASED"
    Case #REGDB_E_WRITEREGDB
      Message = "An error occurred writing the CLSID To the registry."
    Case #E_OUTOFMEMORY
      Message = "Out of memory."
    Case #STG_E_INSUFFICIENTMEMORY
      Message = "Out of memory."
    Case #E_INVALIDARG
      Message = "One or more of the arguments is invalid."
    Case #DISP_E_UNKNOWNNAME
      Message = "One Or more of the names could not be found."
    Case #DISP_E_UNKNOWNLCID
      Message = "The locale identifier (LCID) could not be found in the OLE DLLs."
    Default
      Message = "Error Number: $" + Hex(HResult)
  EndSelect
  
  ProcedureReturn Message
EndProcedure 

ProcedureDLL.l PT_MSXML3_CreateDomDocument()
  
  HResult = CoCreateInstance_(?CLSID_XMLDOM, 0, 1, ?IID_IXMLDOMDocument, @xDoc)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf 
  
  ProcedureReturn xDoc
  
EndProcedure

ProcedureDLL   PT_MSXML3_ReleaseObject(oPtr)
  
  If oPtr = 0 : ProcedureReturn #False : EndIf
  
  myIUnknown.IUnknown
  myIUnknown = oPtr
  HResult = myIUnknown\Release()
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)

EndProcedure

ProcedureDLL.l PT_MSXML3_GetDocumentElement(XMLDOMDocument) ; Returns the root element of the document.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_documentElement(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CreateElement(XMLDOMDocument,sElementName.s) ; Creates an element node using the specified name.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sElementName = ""  : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\createElement(PT_MSXML3_Ansi2Uni(sElementName), @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CreateTextNode(XMLDOMDocument, sTextNodeText.s) ; Creates a text node that contains the supplied data.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sTextNodeText = ""  : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\createTextNode(PT_MSXML3_Ansi2Uni(sTextNodeText), @O_IXMLDOMNode) 
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CreateComment(XMLDOMDocument, sCommentText.s) ; Creates a comment node that contains the supplied data.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sCommentText = ""  : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\createComment(PT_MSXML3_Ansi2Uni(sCommentText), @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CreateCDATASection(XMLDOMDocument, sCDATAText.s) ; Creates a CDATA section node that contains the supplied data.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sCDATAText = ""    : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\createCDATASection(PT_MSXML3_Ansi2Uni(sCDATAText), @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CreateAttribute(XMLDOMDocument, sAttributeName.s) ; Creates a new attribute with the specified name.
  
  If XMLDOMDocument = 0  : ProcedureReturn #False : EndIf
  If sAttributeName = "" : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\createAttribute(PT_MSXML3_Ansi2Uni(sAttributeName), @O_IXMLDOMAttribute)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMAttribute
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetElementsByTagName(XMLDOMDocument, sTagName.s) ; Returns a collection of elements that have the specified name
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sTagName = ""      : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\getElementsByTagName(PT_MSXML3_Ansi2Uni(sTagName), @O_IXMLDOMNodeList)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  

  ProcedureReturn O_IXMLDOMNodeList
  
EndProcedure


; ProcedureDLL.l PT_MSXML3_CreateNodeByNodeTypeString(XMLDOMDocument, sType.s, sName.s, sNameSpace.s) ; Creates a node using the supplied type, name, and namespace.
  ; 
  ; If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  ; 
  ; I_IXMLDOMDocument = XMLDOMDocument
  ; 
  ; VariantValue.VARIANT
  ; VariantValue\vt = #VT_BSTR
  ; VariantValue\bstrVal = PT_MSXML3_Ansi2Uni(sType)
  ; *V1.pToVariant = VariantValue
  ; 
  ; HResult = I_IXMLDOMDocument\createNode(*V1\a,*V1\b,*V1\c,*V1\d, PT_MSXML3_Ansi2Uni(sName), PT_MSXML3_Ansi2Uni(sNameSpace), @O_IXMLDOMNode)
  ; 
  ; ;HResult = I_IXMLDOMDocument\createNode(VariantValue, PT_MSXML3_Ansi2Uni(sName), PT_MSXML3_Ansi2Uni(sNameSpace), @O_IXMLDOMNode)
  ; 
  ; LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  ; 
  ; If HResult <> #S_OK : ProcedureReturn #False : EndIf
  ; 
  ; ProcedureReturn O_IXMLDOMNode
  ; 
; EndProcedure
; 
; ProcedureDLL.l PT_MSXML3_CreateNodeByNodeTypeValue(XMLDOMDocument, lType.l, sName.s, sNameSpace.s) ; Creates a node using the supplied type, name, and namespace.
  ; 
 ; 
; EndProcedure
 
ProcedureDLL.l PT_MSXML3_NodeFromID(XMLDOMDocument, sID.s) ; Returns the node that matches the ID attribute.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sID = ""            : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\nodeFromID(PT_MSXML3_Ansi2Uni(sID), @O_IXMLDOMNode) 
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_Load(XMLDOMDocument, sXMLFile.s) ; Loads an XML document from the specified location.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sXMLFile = ""      : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_BSTR
  VariantValue\bstrVal = PT_MSXML3_Ansi2Uni(sXMLFile)
  *V1.pToVariant = VariantValue
  
  HResult = I_IXMLDOMDocument\load(*V1\a,*V1\b,*V1\c,*V1\d,@ReturnValue) 
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True
  
EndProcedure

ProcedureDLL.l PT_MSXML3_LoadXML(XMLDOMDocument, sXMLString.s) ; Loads an XML document using the supplied string.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sXMLString = ""     : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\loadXML(PT_MSXML3_Ansi2Uni(sXMLString), @ReturnValue) 
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetReadyState(XMLDOMDocument) ; Indicates the current state of the XML document.
  
  ; LOADING     (1)  The load is in progress. Reading persisted properties, but not yet parsing Data. For readyState definitions, Data should be considered equivalent To binary large object (BLOB) properties.  
  ; LOADED      (2)  Reading of The persisted properties completed. Reading And parsing Data, but The object model is not yet available.  
  ; INTERACTIVE (3)  Some Data has been Read And parsed, And The object model is now available on The partially retrieved Data set. Although The object model is available during this state, it is Read-only.  
  ; COMPLETED   (4)  The document has been completely loaded, successfully Or unsuccessfully. 
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_readyState(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetUrl(XMLDOMDocument) ; Returns the URL for the last loaded XML document.
  
  If XMLDOMDocument = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_url(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetAsync(XMLDOMDocument) ; Specifies if asynchronous download is permitted.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_async(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutAsync(XMLDOMDocument, lAsyncState.l)  ; Specifies if asynchronous download is permitted.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\put_async(lAsyncState)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_Abort(XMLDOMDocument)  ; Aborts an asynchronous download in progress.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\abort()
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetValidateOnParse(XMLDOMDocument) ; Indicates whether the parser should validate this document.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_validateOnParse(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutValidateOnParse(XMLDOMDocument, lValidate.l) ; Indicates whether the parser should validate this document.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\put_validateOnParse(lValidate)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetResolveExternals(XMLDOMDocument) ; Indicates whether external definitions, resolvable namespaces, document type definition (DTD) external subsets, and external entity references, are to be resolved at parse time, independent of validation.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_resolveExternals(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutResolveExternals(XMLDOMDocument, lResolveExternals.l) ; ; Indicates whether external definitions, resolvable namespaces, document type definition (DTD) external subsets, and external entity references, are to be resolved at parse time, independent of validation.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\put_resolveExternals(lResolveExternals)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetPreserveWhiteSpace(XMLDOMDocument) ; Specifies the default white space handling.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_preserveWhiteSpace(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutPreserveWhiteSpace(XMLDOMDocument, lPreserveWhiteSpace.l) ; Specifies the default white space handling.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\put_preserveWhiteSpace(lPreserveWhiteSpace)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetNodeName(XMLDOMNode) ; Returns the qualified name for attribute, document type, element, entity, or notation nodes. Returns a fixed string for all other node types. Read-only.
  
  If XMLDOMNode = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_nodeName(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetNodeType(XMLDOMDocument) ; Specifies the XML Document Object Model (DOM) node type, which determines valid values and whether the node can have child nodes.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_nodeType(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetNodeTypeString(XMLDOMDocument) ; Returns the node type in string form.
  
  If XMLDOMDocument = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_nodeTypeString(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetParentNode(XMLDOMNode) ; Contains the parent node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_parentNode(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetChildNodes(XMLDOMNode) ; Contains a node list containing the children nodes.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_childNodes(@O_IXMLDOMNodeList)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNodeList
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetFirstChild(XMLDOMNode) ; Contains the first child of the node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_firstChild(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetLastChild(XMLDOMNode) ; Returns the last child node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_lastChild(@O_IXMLDOMNode) 
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetPreviousSibling(XMLDOMNode) ; Contains the previous sibling of the node in the parent's child list.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_previousSibling(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure
  
ProcedureDLL.l PT_MSXML3_GetNextSibling(XMLDOMNode) ; Contains the next sibling of the node in the parent's child list.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_nextSibling(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_InsertBefore(XMLDOMNode_Parent, XMLDOMNode_New, XMLDOMNode_Ref) ; Inserts a child node to the left of the specified node or at the end of the list.
  
  If XMLDOMNode_Parent = 0 : ProcedureReturn #False : EndIf
  If XMLDOMNode_New = 0    : ProcedureReturn #False : EndIf
  If XMLDOMNode_Ref  = 0   : ProcedureReturn #False : EndIf
  
  m_p_ParentNode.myIXMLDOMNode
  m_p_ParentNode =  XMLDOMNode_Parent
  
  m_p_NewNode.myIXMLDOMNode
  m_p_NewNode =  XMLDOMNode_New
  
  m_p_RefNode.myIXMLDOMNode
  m_p_RefNode =  XMLDOMNode_Ref
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_DISPATCH
  VariantValue\bstrVal = m_p_RefNode
  *V1.pToVariant = VariantValue
  
  HResult = m_p_ParentNode\insertBefore(m_p_NewNode,*V1\a,*V1\b,*V1\c,*V1\d,@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)

  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True 
  
EndProcedure

ProcedureDLL.l PT_MSXML3_ReplaceChild(XMLDOMNode_Parent, XMLDOMNode_Old, XMLDOMNode_New) ; Replaces the specified old child node with the supplied new child node.
  
  If XMLDOMNode_Parent = 0 : ProcedureReturn #False : EndIf
  If XMLDOMNode_Old = 0    : ProcedureReturn #False : EndIf
  If XMLDOMNode_New  = 0   : ProcedureReturn #False : EndIf
  
  m_p_ParentNode.myIXMLDOMNode
  m_p_ParentNode = XMLDOMNode_Parent
  
  m_p_OldNode.myIXMLDOMNode
  m_p_OldNode = XMLDOMNode_Old
  
  m_p_NewNode.myIXMLDOMNode
  m_p_NewNode = XMLDOMNode_New
  
  HResult = m_p_ParentNode\replaceChild(m_p_OldNode, m_p_NewNode, @ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True 
  
EndProcedure

ProcedureDLL.l PT_MSXML3_RemoveChild(XMLDOMNode_Parent, XMLDOMNode_Child) ; Removes the specified child node from the list of children.
  
  If XMLDOMNode_Parent = 0 : ProcedureReturn #False : EndIf
  If XMLDOMNode_Child  = 0 : ProcedureReturn #False : EndIf
  
  m_p_ParentNode.myIXMLDOMNode
  m_p_ParentNode = XMLDOMNode_Parent
  
  m_p_ChildNode.myIXMLDOMNode
  m_p_ChildNode = XMLDOMNode_Child
  
  HResult = m_p_ParentNode\removeChild(m_p_ChildNode,@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True 
  
EndProcedure

ProcedureDLL.l PT_MSXML3_AppendChild(XMLDOMNode_Parent, XMLDOMNode_Child) ; Appends a new child node as the last child of the node.
  
  If XMLDOMNode_Parent = 0 : ProcedureReturn #False : EndIf
  If XMLDOMNode_Child  = 0 : ProcedureReturn #False : EndIf
  
  m_p_ParentNode.myIXMLDOMNode
  m_p_ParentNode = XMLDOMNode_Parent
  
  m_p_ChildNode.myIXMLDOMNode
  m_p_ChildNode  = XMLDOMNode_Child
  
  HResult = m_p_ParentNode\appendChild(m_p_ChildNode,@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True 
  
EndProcedure

ProcedureDLL.l PT_MSXML3_HasChildNodes(XMLDOMNode) ; Provides a fast way to determine whether a node has children.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\hasChildNodes(@bReturnValue.b)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn bReturnValue
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetOwnerDocument(XMLDOMNode) ; Returns the root of the document that contains the node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_ownerDocument(@O_IXMLDOMDocument)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMDocument
  
EndProcedure

ProcedureDLL.l PT_MSXML3_CloneNode(XMLDOMNode, lDeep.l) ; Clones a new node
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  If lDeep <> #VARIANT_FALSE : lDeep = #VARIANT_TRUE : EndIf
  
  HResult = I_IXMLDOMNode\cloneNode(lDeep, @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetText(XMLDOMNode) ; Returns the text content of the node or the concatenated text representing the node and its descendants.
  
  If XMLDOMNode = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_text(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutText(XMLDOMNode, sText.s) ; Specifies the text content of the node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\put_text(PT_MSXML3_Ansi2Uni(sText))
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.b PT_MSXML3_GetSpecified(XMLDOMNode) ; Indicates whether the node (usually an attribute) is explicitly specified or derived from a default value in the document type definition (DTD) or schema.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_specified(@bReturnValue.b)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn bReturnValue
  
EndProcedure
 
ProcedureDLL.l PT_MSXML3_GetDefinition(XMLDOMNode) ; Returns the definition of the node in the document type definition (DTD) or schema.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_definition(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetNodeTypedValue(XMLDOMNode) ; Returns the node value expressed in its defined data type.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_nodeTypedValue(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutNodeTypedValue(XMLDOMNode, lNodeTypedValue.l) ; Specifies the node value expressed in its defined data type.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\put_nodeTypedValue(lNodeTypedValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetDataType(XMLDOMNode) ; Returns the data type for this node. This property applies to document type definitions (DTDs) only, not to XML-Data Reduced (XDR) schemas or XML Schema definition language (XSD) schemas.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_dataType(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL   PT_MSXML3_PutDataType(XMLDOMNode, lDataType.l) ; Specifies the data type for this node. This property applies to document type definitions (DTDs) only, not to XML-Data Reduced (XDR) schemas or XML Schema definition language (XSD) schemas.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\put_dataType(lDataType)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetXml(XMLDOMDocument) ; Contains the XML representation of the node and all its descendants.
  
  If XMLDOMDocument = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\get_xml(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_SelectNodes(XMLDOMDocument, sXPath.s) ; Applies the specified pattern-matching operation to this node's context and returns the list of matching nodes as NodeList.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sXPath = ""        : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\selectNodes(PT_MSXML3_Ansi2Uni(sXPath), @O_IXMLDOMNodeList)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNodeList
  
EndProcedure

ProcedureDLL.l PT_MSXML3_SelectSingleNode(XMLDOMDocument, sXPath.s) ; Applies the specified pattern-matching operation to this node's context and returns the first matching node.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sXPath = ""         : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  HResult = I_IXMLDOMDocument\selectSingleNode(PT_MSXML3_Ansi2Uni(sXPath), @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetPrefix(XMLDOMNode) ; Returns the namespace prefix.
  
  If XMLDOMNode = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_prefix(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure
 
ProcedureDLL.s PT_MSXML3_GetBaseName(XMLDOMNode) ; Returns the base name for the name qualified with the namespace.
  
  If XMLDOMNode = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMNode =  XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_baseName(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.s PT_MSXML3_TransformNode(XMLDOMDocument_XML,XMLDOMDocument_XSL)
  
  If XMLDOMDocument_XML = 0 : ProcedureReturn "" : EndIf
  If XMLDOMDocument_XSL = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument     =  XMLDOMDocument_XML
  I_IXMLDOMDocument_XSL =  XMLDOMDocument_XSL
  
  HResult = I_IXMLDOMDocument\transformNode(I_IXMLDOMDocument_XSL, @ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_Save(XMLDOMDocument, sXMLFile.s) ; Saves an XML document to the specified location.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  If sXMLFile = ""      : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_BSTR
  VariantValue\bstrVal = PT_MSXML3_Ansi2Uni(sXMLFile)
  *V1.pToVariant = VariantValue
  
  HResult = I_IXMLDOMDocument\save(*V1\a, *V1\b, *V1\c, *V1\d)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn #True
  
EndProcedure

;- Nodelist

ProcedureDLL.l PT_MSXML3_NodeListGetItem(XMLDOMNodeList, lPosition.l) ; Allows random access to individual nodes within the collection. Zerobased.
  
  If XMLDOMNodeList = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNodeList = XMLDOMNodeList
  
  HResult = I_IXMLDOMNodeList\get_item(lPosition, @O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure 

ProcedureDLL.l PT_MSXML3_NodeListGetLength(XMLDOMNodeList) ; Indicates the number of items in the collection.
  
  If XMLDOMNodeList = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNodeList = XMLDOMNodeList
  
  HResult = I_IXMLDOMNodeList\get_length(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.l PT_MSXML3_NodeListNextNode(XMLDOMNodeList)  ; Returns the next node in the collection.
  
  If XMLDOMNodeList = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNodeList = XMLDOMNodeList
  
  HResult = I_IXMLDOMNodeList\nextNode(@O_IXMLDOMNode)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure

ProcedureDLL   PT_MSXML3_NodeListReset(XMLDOMNodeList) ; Resets the iterator.
  
  If XMLDOMNodeList = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNodeList = XMLDOMNodeList
  
  HResult = I_IXMLDOMNodeList\reset()
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

;- Attributes

ProcedureDLL.l PT_MSXML3_GetAttributes(XMLDOMNode) ; Contains the list of attributes for this node.
  
  If XMLDOMNode = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  HResult = I_IXMLDOMNode\get_attributes(@O_IXMLDOMAttributes)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMAttributes
  
EndProcedure

ProcedureDLL.l PT_MSXML3_AttributesGetLength(XMLDOMAttributes) ; Indicates the number of items in the collection.
  
  If XMLDOMAttributes = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMAttributes = XMLDOMAttributes
  
  HResult = I_IXMLDOMAttributes\get_length(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.l PT_MSXML3_AttributesGetItem(XMLDOMAttributes, lPosition.l) ; Allows random access to individual nodes within the collection. Zerobased.
  
  If XMLDOMAttributes = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMAttributes = XMLDOMAttributes
  
  HResult = I_IXMLDOMAttributes\get_item(lPosition, @O_IXMLDOMAttribute)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMAttribute
  
EndProcedure 

ProcedureDLL.l PT_MSXML3_AttributesSetNamedItem(XMLDOMAttributes, XMLDOMAttribute) ; Adds the supplied node to the collection.
  
  If XMLDOMAttributes = 0 : ProcedureReturn #False : EndIf
  If XMLDOMAttribute  = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMAttributes = XMLDOMAttributes
  
  HResult = I_IXMLDOMAttributes\setNamedItem(XMLDOMAttribute, @ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.l PT_MSXML3_AttributesGetNamedItem(XMLDOMAttributes, sAttributeName.s) ; Returns the named Attribute
  
  If XMLDOMAttributes =  0 : ProcedureReturn #False : EndIf
  If sAttributeName     = "" : ProcedureReturn #False : EndIf
  
  I_IXMLDOMAttributes = XMLDOMAttributes
  
  HResult = I_IXMLDOMAttributes\getNamedItem(PT_MSXML3_Ansi2Uni(sAttributeName), @O_IXMLDOMAttribute)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn #False : EndIf
  
  ProcedureReturn O_IXMLDOMAttribute
  
EndProcedure

ProcedureDLL.s PT_MSXML3_AttributesGetText(XMLDOMAttribute) ; Returns the attribute value.
  
  If XMLDOMAttribute = 0  : ProcedureReturn "" : EndIf
  
  I_IXMLDOMAttribute = XMLDOMAttribute
  
  HResult = I_IXMLDOMAttribute\get_text(@ReturnValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.s PT_MSXML3_AttributesGetName(XMLDOMAttribute) ; Returns the attribute name.
  
  If XMLDOMAttribute = 0  : ProcedureReturn "" : EndIf
  
  I_IXMLDOMAttribute = XMLDOMAttribute
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_BSTR

  HResult = I_IXMLDOMAttribute\get_name(@VariantValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(VariantValue\bstrVal)
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL   PT_MSXML3_AttributesPutValue(XMLDOMAttribute, sAttributeValue.s) ; Specifies the attribute value.
  
  If XMLDOMAttribute = 0  : ProcedureReturn #False : EndIf
  
  I_IXMLDOMAttribute = XMLDOMAttribute
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_BSTR
  VariantValue\bstrVal = PT_MSXML3_Ansi2Uni(sAttributeValue)
  *V1.pToVariant = VariantValue
  
  HResult = I_IXMLDOMAttribute\put_value(*V1\a,*V1\b,*V1\c,*V1\d)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
EndProcedure

ProcedureDLL.s PT_MSXML3_AttributesGetValue(XMLDOMAttribute) ; Returns the attribute value.
  
  If XMLDOMAttribute = 0  : ProcedureReturn "" : EndIf
  
  I_IXMLDOMAttribute = XMLDOMAttribute
  
  VariantValue.VARIANT
  VariantValue\vt = #VT_BSTR
  
  HResult = I_IXMLDOMAttribute\get_value(@VariantValue)
  
  LastMessage$ = PT_MSXML3_GetHResultMessage(HResult)
  
  Debug LastMessage$
  
  CallDebugger
  
  If HResult <> #S_OK : ProcedureReturn "" : EndIf
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(VariantValue\bstrVal)
  
  ProcedureReturn ReturnString$
  
EndProcedure

;- ParseError

ProcedureDLL.s PT_MSXML3_GetParseErrorReason(XMLDOMDocument) ; Describes the reason for the error.
  
  If XMLDOMDocument = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  I_IXMLDOMDocument\get_parseError(@O_IXMLDOMParseError)
  
  O_IXMLDOMParseError\get_reason(@ReturnValue)
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
  
  O_IXMLDOMParseError\Release()
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetParseErrorErrorcode(XMLDOMDocument) ; Contains the error code of the last parse error.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  I_IXMLDOMDocument\get_parseError(@O_IXMLDOMParseError)
  
  O_IXMLDOMParseError\get_errorCode(@ReturnValue)
  
  O_IXMLDOMParseError\Release()
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.s PT_MSXML3_GetParseErrorSrctext(XMLDOMDocument) ; Returns the full text of the line containing the error.
  
  If XMLDOMDocument = 0 : ProcedureReturn "" : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  I_IXMLDOMDocument\get_parseError(@O_IXMLDOMParseError)
  
  O_IXMLDOMParseError\get_srcText(@ReturnValue) 
  
  ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue) 
  
  O_IXMLDOMParseError\Release()
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetParseErrorLine(XMLDOMDocument) ; Specifies the line number that contains the error.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  I_IXMLDOMDocument\get_parseError(@O_IXMLDOMParseError)
  
  O_IXMLDOMParseError\get_line(@ReturnValue) 
  
  O_IXMLDOMParseError\Release()
  
  ProcedureReturn ReturnValue
  
EndProcedure

ProcedureDLL.l PT_MSXML3_GetParseErrorLinepos(XMLDOMDocument) ; Contains the character position within the line where the error occurred.
  
  If XMLDOMDocument = 0 : ProcedureReturn #False : EndIf
  
  I_IXMLDOMDocument = XMLDOMDocument
  
  I_IXMLDOMDocument\get_parseError(@O_IXMLDOMParseError)
  
  O_IXMLDOMParseError\get_linepos(@ReturnValue) 
  
  O_IXMLDOMParseError\Release()
  
  ProcedureReturn ReturnValue
  
EndProcedure

;- Special-Section

ProcedureDLL.s PT_MSXML3_SpecialTransformFromStringsToString(sXMLString.s, sXSLString.s)
  
  If sXMLString = "" : ProcedureReturn "" : EndIf
  If sXSLString = "" : ProcedureReturn "" : EndIf
  
  oXML.myIXMLDOMDocument = PT_MSXML3_CreateDomDocument()
  
  If oXML
    
    oXSL.myIXMLDOMDocument = PT_MSXML3_CreateDomDocument()
    
    If oXSL
      
      If PT_MSXML3_LoadXML(oXML,sXMLString)
        
        If PT_MSXML3_LoadXML(oXSL,sXSLString)
          
          ReturnString$ = PT_MSXML3_TransformNode(oXML,oXSL)
          
        EndIf ; If PT_MSXML3_LoadXML(oXSL,sXSL)
        
      EndIf ; If PT_MSXML3_LoadXML(oXML,sXML)
      
      oXSL\Release()
      
    EndIf ; If oXSL
    
    oXML\Release()
    
  EndIf ; If oXML
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.s PT_MSXML3_SpecialTransformFromFilesToString(sXMLFile.s, sXSLFile.s)
  
  If sXMLFile = "" : ProcedureReturn "" : EndIf
  If sXSLFile = "" : ProcedureReturn "" : EndIf
  
  oXML.myIXMLDOMDocument = PT_MSXML3_CreateDomDocument()
  
  If oXML
    
    oXSL.myIXMLDOMDocument = PT_MSXML3_CreateDomDocument()
    
    If oXSL
      
      If PT_MSXML3_Load(oXML,sXMLFile)
        
        If PT_MSXML3_Load(oXSL,sXSLFile)
          
          ReturnString$ = PT_MSXML3_TransformNode(oXML,oXSL)
          
        EndIf ; If PT_MSXML3_LoadXML(oXSL,sXSL)
        
      EndIf ; If PT_MSXML3_LoadXML(oXML,sXML)
      
      oXSL\Release()
      
    EndIf ; If oXSL
    
    oXML\Release()
    
  EndIf ; If oXML
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.s PT_MSXML3_SpecialGetNamedAttributeValue(XMLDOMNode, sAttributeName.s)
  
  If XMLDOMNode = 0     : ProcedureReturn "" : EndIf
  If sAttributeName = "" : ProcedureReturn "" : EndIf
  
  xNode.myIXMLDOMNode
  
  I_IXMLDOMNode = XMLDOMNode
  
  ReturnString$=""
  
  If I_IXMLDOMNode\get_attributes(@O_IXMLDOMAttributes) = #S_OK
    
    If O_IXMLDOMAttributes
      
      If O_IXMLDOMAttributes\getNamedItem(PT_MSXML3_Ansi2Uni(sAttributeName), @xNode) = #S_OK
        
        If xNode
          
          xNode\get_text(@ReturnValue)
          
          ReturnString$ = PT_MSXML3_Uni2Ansi(ReturnValue)
          
          xNode\Release()
          
        EndIf
        
      EndIf
      
      O_IXMLDOMAttributes\Release()
      
    EndIf
    
  EndIf
  
  ProcedureReturn ReturnString$
  
EndProcedure

ProcedureDLL.l PT_MSXML3_SpecialSetNamedAttributeValue(XMLDOMDocument, XMLDOMNode, sAttributeName.s, sAttributeValue.s)
  
  If XMLDOMNode = 0     : ProcedureReturn "" : EndIf
  If sAttributeName = "" : ProcedureReturn "" : EndIf
  
  I_IXMLDOMNode = XMLDOMNode
  
  oAttributes = PT_MSXML3_GetAttributes(I_IXMLDOMNode)
  
  If oAttributes
    
    oAttribute = PT_MSXML3_AttributesGetNamedItem(oAttributes, sAttributeName)
    
    If oAttribute = #False
      
      oAttribute = PT_MSXML3_CreateAttribute(XMLDOMDocument, sAttributeName)
      PT_MSXML3_AttributesSetNamedItem(oAttributes, oAttribute)
      
    EndIf
    
    PT_MSXML3_AttributesPutValue(oAttribute, sAttributeValue)
    
    PT_MSXML3_ReleaseObject(oAttribute)
    PT_MSXML3_ReleaseObject(oAttributes)
    
  EndIf
  
EndProcedure

ProcedureDLL.l PT_MSXML3_SpecialGetNodeFromString(sXMLString.s)
  
  I_IXMLDOMDocument = PT_MSXML3_CreateDomDocument()
  
  PT_MSXML3_LoadXML(I_IXMLDOMDocument,sXMLString)
  
  O_IXMLDOMNode = PT_MSXML3_SelectSingleNode(I_IXMLDOMDocument,"//")
  
  I_IXMLDOMDocument\Release()
  
  ProcedureReturn O_IXMLDOMNode
  
EndProcedure  

ProcedureDLL.s PT_MSXML3_SpecialGetLastMessage()
  ProcedureReturn LastMessage$
EndProcedure
 
ProcedureDLL.s PT_MSXML3_SpecialGetVersionInfo()
  ReturnString$ = "2005-01-17"
  ProcedureReturn ReturnString$
EndProcedure

;- Datasection
  
DataSection
CLSID_XMLDOM:             ;{2933BF90-7B36-11D2-B20E-00C04F983E60}
Data.l $2933BF90
Data.w $7B36,$11D2
Data.b $B2,$0E,$00,$C0,$4F,$98,$3E,$60
EndDataSection
  
DataSection
IID_IXMLDOMDocument:      ;{2933BF81-7B36-11D2-B20E-00C04F983E60}
Data.l $2933BF81
Data.w $7B36,$11D2
Data.b $B2,$0E,$00,$C0,$4F,$98,$3E,$60
EndDataSection 
Zuletzt geändert von Kiffi am 21.03.2005 01:14, insgesamt 1-mal geändert.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Blöde frage: Wozu ist das ganze?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

GPI hat geschrieben:Blöde frage: Wozu ist das ganze?
die Funktionssammlung kann den Zugriff auf die MSXML3.DLL vereinfachen.
Das ganze ist eher als eine Art Wrapper zu verstehen.

Ich hatte vor einiger Zeit schon mal den gleichen Code als Library vorgestellt:

http://forums.purebasic.com/german/viewtopic.php?t=1480

Grüße ... Kiffi
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

@GPI
Wenn de ganz professionel und cool wirken willst, speicher die Settings von jaPBe in einer XML. Sowas macht sich immer gut 8)...
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@Kiffi: Eine Zip zum Download wäre vielleicht etwas praktischer, 1670 Zeilen im Browser durchscrollen ist "harte Arbeit". Ansonsten :allright:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> "harte Arbeit"

mensch nee, dieses faule Programmiererpack! ;-)

Hier ist die gezippte Version des Codes herunterladbar: http://www.b-4-b.de/pt_msxml3_src.zip

Grüße ... Kiffi
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> mensch nee, dieses faule Programmiererpack! :)
Mich kannste ja nicht meinen, ich hab's ja schon, sonst wüßte ich die Anzahl an Zeilen ja nicht :)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Man muss doch lediglichlich einen Dreifach-Klick oder auch Tripleclick auf den Code hier im Forum ausführen und schon ist er komplett markiert. Bevor ich das wusste, habe ich auch immer oben angefangen und beim Runterscrollen bis unten hin alles markiert. :roll:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

NicTheQuick hat geschrieben:Man muss doch lediglichlich einen Dreifach-Klick oder auch Tripleclick auf den Code hier im Forum ausführen und schon ist er komplett markiert. Bevor ich das wusste, habe ich auch immer oben angefangen und beim Runterscrollen bis unten hin alles markiert. :roll:
Dein Tip funktioniert leider nur im IE, mit Firefox geht das leider nicht :(
Trotzdem danke für den Tip
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

ts-soft hat geschrieben:Dein Tip funktioniert leider nur im IE, mit Firefox geht das leider nicht :(
Trotzdem danke für den Tip
Markiere die erste Zeile, scroll zum Ende des Sourcecodes,
drücke SHIFT und klicke dann -bei gehaltener SHIFT-Taste-
mit dem linken Mausknopf ans Ende des Sources, nach dem
letzten Zeichen.
Ganzer Code markiert. FireFox.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten