#135447 - 2005-03-18 05:15 PM
Re: RFC: ReadXmlString/WriteXmlString
|
jtokach
Seasoned Scripter
Registered: 2001-11-15
Posts: 513
Loc: PA, USA
|
EDIT1: Renamed some stuff and added some stuff.
EDIT2: Added Remove* functions (Jose suggestion)
Renamed functions from *Attribute to *Attr
Shawn, if there's sufficient reason to, we can 'overload' these functions by allowing the source argument to be either a path\filename, an XMLDOM object, or an XML string. This raises the complexity of the functions, but also addresses performance and increases usability.
All, I'm envisioning these functions as a cross between the _profilestring functions and the registry functions. Kinda mimics real life as XML seems to be a cross between INI and a hierarchal db like the REG. Here's how I see it, please comment:
Core functions (We have a solid base on most of this already)
Code:
LoadXML() - Load an existing .XML file, instantiate XMLDOM object for use regardless of file existance.
SaveXML() - Saves an XMLDOM object
FormatXML() - Formats the output style of an XMLDOM object to the standard
EnumXMLElement() - Enums child elements of a given element
EnumXMLAttr() - Enums all attributes of an element
CreateXMLElement() - Creates an empty element pair
RemoveXMLElement() - Deletes an XML element (Recursively?)
WriteXMLValue() - Writes a value to an XML element
ReadXMLValue() - Reads the value of an XML element
WriteXMLAttr() - Writes an attribute to an XML element
ReadXMLAttr() - Read a specific attribute of an XML element
RemoveXMLAttr() - Deletes an XML element attribut
Secondary functions
Code:
ApplyXSL() - Applies an XSL template. (Much potential here for an expanded set, see
http://www.devguru.com/Technologies/xslt/quickref/xslt_index.html
or NTDOC's post above.
FilterXML() - Apply a filter to an XMLDOM object. (Search the db. XSL related.)
Edited by jtokach (2005-03-18 08:07 PM)
_________________________
-Jim
...the sort of general malaise that only the genius possess and the insane lament.
|
Top
|
|
|
|
#135449 - 2005-03-18 05:40 PM
Re: RFC: ReadXmlString/WriteXmlString
|
jtokach
Seasoned Scripter
Registered: 2001-11-15
Posts: 513
Loc: PA, USA
|
Bingo. Even more than that though.
WriteXmlValue(string, string, variant) WriteXmlValue(object, string, variant)
and
WriteXmlValue(xmlstring, string, variant)
Where if instr(xmlstring,"<") Not a filename, but an XML string of elements. So you could build your XML file in a string and then do a $=$objXML.loadXML($strXML) (note the loadXML method instead of .load)
I really haven't thought out what this would buy us as brainstorming doesn't lend well to rational thought. But, I think later it may handy when dealing with creating XSL on the fly or creating new .XML files from portions of existing XML.
I forgot to add WriteXmlValue() the previous list... Done.
_________________________
-Jim
...the sort of general malaise that only the genius possess and the insane lament.
|
Top
|
|
|
|
#135455 - 2005-03-18 07:39 PM
Re: RFC: ReadXmlString/WriteXmlString
|
Allen
KiX Supporter
Registered: 2003-04-19
Posts: 4549
Loc: USA
|
Code:
<Album ref="CD142" category="Folk"> <title>Boil The Breakfast Early</title> <artist>The Chieftains</artist> </Album>
ahh just what I was wondering about earlier... Shawn, Jose's code above is exactly where I was going with my earlier question about the XML format you are expecting. In this example there are values defined within the Album (ref="CD142"), and then child attributes like title and artitist.
I'll be the first one to admit, I don't know a whole lot about XML, but would it be easiest to say the format of the XML is expected to be only one way or another, or are the UDFs already taking in consideration the altering data formats?
|
Top
|
|
|
|
#135459 - 2005-03-18 08:18 PM
Re: RFC: ReadXmlString/WriteXmlString
|
jtokach
Seasoned Scripter
Registered: 2001-11-15
Posts: 513
Loc: PA, USA
|
Les, the *ProfileString do the same thing, although Kix does the work of open and close behind the scenes. Since we can't operate at that level, we have no choice but to Open, Read/Write, Close somewhere, either internal to the function or external to it.
I asked Shawn, in a previous post, why LoadXML and SaveXML were seperated, and he stated for effeciency. Our collective agreement has been to overload the functions so that both methods (writeline type and *profilestring) are available.
_________________________
-Jim
...the sort of general malaise that only the genius possess and the insane lament.
|
Top
|
|
|
|
#135463 - 2005-03-18 08:52 PM
Re: RFC: ReadXmlString/WriteXmlString
|
jtokach
Seasoned Scripter
Registered: 2001-11-15
Posts: 513
Loc: PA, USA
|
Here's all of what we have so far. Some functions have been renamed from their original.
LoadXML() - Load an existing .XML file, instantiate XMLDOM object for use regardless of file existance.
SaveXML() - Saves an XMLDOM object
FormatXML() - Formats the output style of an XMLDOM object to the standard
EnumXMLElement() - Enums child elements of a given element
EnumXMLAttr() - Enums all attributes of an element
CreateXMLElement() - Creates an empty element pair
RemoveXMLElement() - Deletes an XML element (Recursively?)
WriteXMLValue() - Writes a value to an XML element
ReadXMLValue() - Reads the value of an XML element
WriteXMLAttr() - Writes an attribute to an XML element
ReadXMLAttr() - Read a specific attribute of an XML element
RemoveXMLAttr() - Deletes an XML element attribut
Secondary functions
ApplyXSL() - Applies an XSL template. (Much potential here for an expanded set, see
http://www.devguru.com/Technologies/xslt/quickref/xslt_index.html
or NTDOC's post above.
FilterXML() - Apply a filter to an XMLDOM object. (Search the db. XSL related.)
Code:
; CreateXMLElement() - Creates an empty element pair
Function CreateXMLElement()
EndFunction
; EnumXMLAttr() - Enums all attributes of an element
Function EnumXMLAttr()
EndFunction
; EnumXMLElement() - Enums child elements of a given element
Function EnumXMLElement()
EndFunction
;FormatXML() - Formats the output style of an XMLDOM object to the standard
Function FormatXML($objXMLDOM)
Dim $,$strXSL,$objXSL
;Create and Load XSL
; <?xml version="1.0" encoding="UTF-8"?>
; <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
; <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
; <xsl:template match="/ | @* | node()">
; <xsl:copy>
; <xsl:apply-templates select="@* | node()" />
; </xsl:copy>
; </xsl:template>
; </xsl:stylesheet>
$strXSL = "<?xml version=" + chr(34) + "1.0" + chr(34) + " encoding=" +
chr(34) + "UTF-8" + chr(34) + "?>" + @CRLF
$strXSL = $strXSL + "<xsl:stylesheet version=" + chr(34) + "1.0" + chr(34) +
" xmlns:xsl=" + chr(34) + "http://www.w3.org/1999/XSL/Transform" +
chr(34) + ">" + @CRLF
$strXSL = $strXSL + "<xsl:output method=" + chr(34) + "xml" + chr(34) +
" version=" + chr(34) + "1.0" + chr(34) + " encoding=" + chr(34) +
"UTF-8" + chr(34) + " indent=" + chr(34) + "yes" + chr(34) + "/>" + @CRLF
$strXSL = $strXSL + "<xsl:template match=" + chr(34) + "/ | @@* | node()" +
chr(34) + ">" + @CRLF
$strXSL = $strXSL + "<xsl:copy>"+ @CRLF
$strXSL = $strXSL + "<xsl:apply-templates select=" + chr(34) +
"@@* | node()" + chr(34) + " />"+ @CRLF
$strXSL = $strXSL + "</xsl:copy>"+ @CRLF
$strXSL = $strXSL + "</xsl:template>"+ @CRLF
$strXSL = $strXSL + "</xsl:stylesheet>"
;? "XLM Stylesheet: " + @CRLF + $strXSL
$objXSL = CreateObject("Microsoft.XMLDOM")
$objXSL.async = false
$=$objXSL.loadXML($strXSL)
;Transform file
$objXMLDOM.TransformNodeToObject ($objXSL, $objXMLDOM)
$formatXML = $objXMLDOM
EndFunction
;LoadXML() - Load an existing .XML file, instantiate XMLDOM object for use
;regardless of file existance.
Function LoadXML($filename)
dim $, $rootNode, $objNewPI, $strType
$loadXml = CreateObject("Microsoft.XMLDOM")
$loadXml.async = False
$loadXml.preserverwhitespace = True
if not $loadXml
return
endif
$ = $loadXml.Load($filename)
EndFunction
; ReadXMLAttr() - Read a specific attribute of an XML element
Function ReadXMLAttr($xml, $Path, $Attr)
Dim $SelectionTag,$AttrName
$SelectionTag = $xml.getElementsByTagName($Path)
$AttrName = $SelectionTag.item(0)
If @Serror = "Member not found."
$ReadXMLAttr = ""
Exit @Error
Else
$ReadXMLAttr =$AttrName.getAttribute($Attr)
EndIf
EndFunction
;ReadXMLElement() - Reads the value of an XML element
Function ReadXMLValue($xml, $key, optional $defaultValue)
Dim $sectionNode
$sectionNode = $xml.SelectSingleNode($key)
If not $sectionNode
$ReadXmlValue = $defaultValue
Else
$ReadXmlValue = $sectionNode.FirstChild.Text
EndIf
EndFunction
; RemoveXMLAttr() - Deletes an XML element attribute
Function RemoveXMLAttr($xml, $Path, $attr, optional $id)
Dim $SelectionTag,$AttrTag,$erase
$SelectionTag = $xml.getElementsByTagName($Path)
If $id=""
$id=0
EndIf
$AttrTag = $SelectionTag.item($id)
$erase = $AttrTag.removeAttribute($attr)
EndFunction
; RemoveXMLElement() - Deletes an XML element (Recursively?)
Function RemoveXMLElement()
EndFunction
;SaveXML() - Saves an XMLDOM object to a file
; Requires: FormatXML()
Function SaveXML($xml, $filename)
$xml = FormatXML($xml)
$SaveXml = $xml.Save($filename)
EndFunction
; WriteXMLAttr() - Writes an attribute to an XML element
Function WriteXMLAttr($xml, $Path, $Attr, $Value)
Dim $SelectionTag,$AttrTag,$,$eu
$SelectionTag = $xml.getElementsByTagName($Path)
$AttrTag = $SelectionTag.item(0)
If @Serror = "Member not found."
$ = WriteXmlValue($xml, $path, "")
$SelectionTag = $xml.getElementsByTagName($Path)
$AttrTag = $SelectionTag.item(0)
EndIf
$eu = $AttrTag.SetAttribute($Attr,$Value)
EndFunction
; WriteXMLValue() - Writes a value to an XML element
Function WriteXMLValue($xml, $path, $value)
dim $p, $rootNode, $sectionNode, $parentNode, $childNode,$node
$sectionNode = $xml.SelectSingleNode($path);
if not $sectionNode
$parentNode = $xml
for each $node in split($path,"/")
$p = $p + $node
$sectionNode = $xml.SelectSingleNode($p)
if not $sectionNode
$sectionNode = $xml.CreateElement($node)
$parentNode = $parentNode.AppendChild($sectionNode)
else
$parentNode = $sectionNode
endif
$p = $p + "/"
next
endif
if $sectionNode
$sectionNode.Text = $value
endif
endfunction
; ******************************************************************************
; ApplyXSL() - Applies an XSL template. (Much potential here for an expanded
; set, see http://www.devguru.com/Technologies/xslt/quickref/xslt_index.html
Function ApplyXSL()
EndFunction
; FilterXML() - Apply a filter to an XMLDOM object. (Search the db. XSL related.)
Function FilterXML()
EndFunction
Edited by jtokach (2005-03-18 08:57 PM)
_________________________
-Jim
...the sort of general malaise that only the genius possess and the insane lament.
|
Top
|
|
|
|
#135464 - 2005-03-18 09:06 PM
Re: RFC: ReadXmlString/WriteXmlString
|
Jose
Seasoned Scripter
Registered: 2001-04-04
Posts: 693
Loc: Buenos Aires - Argentina
|
|
Top
|
|
|
|
Moderator: Glenn Barnas, NTDOC, Arend_, Jochen, Radimus, Allen, ShaneEP, Ruud van Velsen, Mart
|
1 registered
(Allen)
and 413 anonymous users online.
|
|
|