Skip to: site menu | section menu | main content

Wizou's website

What a program...
Currently viewing: Wizou's website » Programs » NSIS plugins » nsisXML

nsisXML 1.4

Presentation

nsisXML is a small NSIS plugin that let you manipulate XML data using Windows MSXML library

You can typically use it to:

  • create, read, modify, write XML files
  • create, remove, search XML nodes
  • set/get nodes content or attributes

Download

Source code included. See license of use below

(See which MSXML version was shipped with Windows & IE at MS Knowledge Base)
Check out also all my other free & useful NSIS plugins!!

ReadMe file

nsisXML -- Small NSIS plugin to manipulate XML data through MSXML
Web site: http://wiz0u.free.fr/prog/nsisXML
-----------------------------------------------------------------

You can typically use it to:
- create, read, modify, write XML files
- create, remove, search XML nodes
- set/get nodes content or attributes

Notes
-----
* For simplicity, I decided to use variables $0 through $3 for most parameters and
	return values, instead of pushing/popping values using the stack
	Therefore, avoid using these variables for something else while dealing with
	nsisXML
* UTF8 text is generated for characters outside 7-bits ASCII range but I'm not
	sure about codepage issue if the installer runs on a different codepage system
	I suggest you don't supply constant strings in NSIS with such characters to
	nsisXML. However strings based on the target system (like paths) should be ok.
* Newly-created XML file won't be nicely indented (but it's still correct XML !)
	If you load, modify and save an XML file that was already indented, it will be
	nicely indented (this is how MSXML works)
* Plugin requires, of course, that MSXML be already installed on the target system
	It should run fine with any version of MSXML and will automatically use the most
recent one.
	Check MS Knowledge Base Q269238 for versions of MSXML shipped with Windows &
Internet Explorer
	(In summary: every computer that has IE 4.0, or more recent, has MSXML installed)

Variables meaning
-----------------
$0	reference to the XML document root (integer)
$1	reference to a parent node (integer)
$2	reference to a child node (integer)
$3	depends - see functions description

Usage
-----
nsisXML::create
	creates an empty XML document in memory and returns its reference in $0 and $1

nsisXML::load <filename>
	load given XML file into document $0
	REQUIRES that an XML document be already created in $0
	(if XML document $0 is not empty, all content will be discarded)
	sets $0 to 0 if an error occured

nsisXML::loadAndValidate <filename>
	same as load but performs validation on the XML if a schema is present, and
	resolves external definitions (may try to establish an Internet connection)

nsisXML::save <filename>
	saves current document $0 to given file

nsisXML::createProcessingInstruction <target> <data>
	creates a new 'processing instruction' node and return its reference in $2

nsisXML::createElement <tag name>
	creates a new element node with given tag name (initially empty) and return its
	reference in $2

nsisXML::createElementInNS <tag name> <namespace>
	creates a new element node with given tag name (initially empty) inside the given
	namespace, and return its reference in $2

nsisXML::appendChild
	appends node $2 as a child of node $1

nsisXML::insertBefore
	insert node $2 as a child of node $1, to the left of node $3
	($3 must be a reference to a child node of $1)

nsisXML::setAttribute <attribute name> <value>
	sets the given attribute with the given value on node $2

nsisXML::getAttribute <attribute name>
	returns in $3 the value for the given attribute name of node $2
	if attribute is not found, returns an empty string

nsisXML::setText <content text>
	sets the text content of the node $2 (<>the text between the tags</>)

nsisXML::getText
	returns in $3 the text content for node $2

nsisXML::select <XPath expression>
	find the first node matching the given XPath expression and return its
	reference in $1 and $2
	if not found, reference will be 0

nsisXML::parentNode
	returns in $1 the reference on the parent node of node $2

nsisXML::removeChild
	removes node $2 from the childs list of node $1

nsisXML::release <node reference>
	release immediately the memory associated with given node (typically $2, $1 or $0)
	for every nsisXML function that returns a node reference, you may want to release
its memory after you're done working with the reference.
	however, please note that in any case, all memory used by MSXML will be released
when your installer terminates.
	(so usually this is not a big concern)




Sample script #1
-----------------
	nsisXML::create
	nsisXML::createProcessingInstruction "xml" 'version="1.0" encoding="UTF-8"
standalone="yes"'
	nsisXML::appendChild
	nsisXML::createElement "main"	; create main document element node
	nsisXML::appendChild
	StrCpy $1 $2			; lets move to this node and create its childs:
	nsisXML::createElementInNS "child" "namespace"
	nsisXML::setAttribute "attrib" "value"
	nsisXML::setText "content"
	nsisXML::appendChild
	nsisXML::createElement "child"
	nsisXML::setAttribute "attrib" "value2"
	nsisXML::setAttribute "active" "yes"
	nsisXML::setText "content2"
	nsisXML::appendChild
	nsisXML::save "Sample.xml"

This script creates the following XML file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main><child attrib="value">content</child><child attrib="value2"
active="yes">content2</child></main>

Sample script #2
-----------------
	nsisXML::create
	nsisXML::load "Sample.xml"
	nsisXML::select '/main/child[@attrib="value2"]'
	IntCmp $2 0 notFound
	nsisXML::getAttribute "active"
	DetailPrint "Attribute 'active' is $3"
	nsisXML::getText
	DetailPrint "Tag <child> contains $3"
	nsisXML::parentNode
	nsisXML::removeChild
	nsisXML::save "Sample.xml"

If applied on the previous "Sample.xml" file, this will print out "value2",
then "content2", and modify Sample.xml to become:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main><child attrib="value">content</child></main>

History
-------
2012-08-10: Added "createElementInNS" for xmlns (namespace) support
2010-04-02: Added "release" to prevent memory leaks.
			Automatic use of most recent MSXML available
			DLL is no longer unloaded after each call (you don't need /NOUNLOAD anymore)
2010-02-04: Added variant for Unicode NSIS
2006-03-22: Added "insertBefore"
2006-03-13: Modified "load". Added "loadAndValidation"

License
-------
Copyright (c) 2005-2012 Olivier Marcoux

This software is provided 'as-is', without any express or implied warranty. In no
event will the authors be held liable for any damages arising from the use of this
software.

Permission is granted to anyone to use this software for any purpose, including
commercial applications, and to alter it and redistribute it freely, subject to the
following restrictions:

    1. The origin of this software must not be misrepresented; you must not claim
that you wrote the original software. If you use this software in a product, an
acknowledgment in the product documentation would be appreciated but is not
required.

    2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.

    3. This notice may not be removed or altered from any source distribution.

Back to top