Documentation for Fortran XML libraries

These libraries can read an xml document into fortran or write fortran data to xml. For more documentation on xml see wikipedia.

To improve performance a special attribute has been defined for tags:
<tag type="realdata">. When this attribute is the data in this tag will be
treated as a huge chunck of real data. The dimensions of this block have to be
set by the attributes size=, which indicates the number of lines and width=,
which indicates the number of columns.


The libraries can be accesed by including in the fortran code

USE xml_parser

A given XML document is read at once to memory, from where any tag can easily

be accessed.

The next thing to be done is to declare a pointer to an XML document.

type(xml_tag):: tag

Then the following functions can be called:

  • xml_tag=>xml_open(treename)

Starts an new xml document tree, with name treename. Returns a pointer to the xml tree

  • xml_tag=>xml_read(filename,treename)

Reads a file named with filename, containing an xml document into the document tree with name treename (name is used if treename is missing). Returns a pointer to the xmltree.

  • call xml_write(filename,treename)

Writes the document tree treename into an xml file, with filename.

  • xml_tag=>xml_close(treename)

Removes the document tree treename from memory, returns the null-pointer.

  • logical=xml_tag_next(xml_tag,name,nameattribute)

Sets the pointer xml_tag to the next tag with name and having optionally the attribute name to nameattribute (ie. <name name=”nameattribute” … >). If name is “” or missing then the pointer xml_tag is set to the next subtag of the last non empty search name (or the entire document). The function returns true or false depending on wether a next tag is found. So in order to search all the subtags of say the tag ‘grid’ it’s sufficient to use:

type(xml_tag),pointer:: tag
do while(xml_tag_next(tag,'grid'))
  do while(xml_tag_next(tag))
    ... code ...
  end do
end do
  • name=xml_name(tag) / call xml_name(tag,tag_name)

returns the name of the tag or it sets the name of a tag.

  • value=xml_attribute(tag,attribute_name) / call xml_attribute(tag,attribute_name,value)

returns the value of an tag attribute, or sets it. xml_name returns the name of the tag or it sets the name of a tag.

  • real_pointer(:,:) / char_pointer(:) => xml_get_data(xml_tag)

Returns a pointer to an array containing the character of real data that is stored in the tag pointed to by xml_tag. So usage could be

character,pointer:: char_data(:)
real,pointer:: real_data(:,:)
... some code ...
... more code ...

The function returns null() if no data is stored.

  • call xml_add_data(xml_tag,real / char_data)

Writes real or character data to the current tag stored in the tag pointed to by xml_tag. So usage could be

character(len=...),pointer:: char_data(:)
character(len=...):: string
real:: real_data(:,:)
... some code ...
call xml_add_data(tag,char_data)
call xml_add_data(tag,string)
call xml_add_data(tag,real_data)
... more code ...

If real data is entered to this function a tag will automatically be treated as a chunck of realdata. Meaning that it wil automatically get the attributes type=*real_data*, size and with (ie. <tag type=”realdata” size= width= >).

  • xml_tag=>xml_tag_open(xml_tag,tagname)

Adds to the current xml_tag a new tag with name tagname and returns a pointer to the new tag.

  • xml_tag=>xml_tag_close(xml_tag)

Returns the a pointer to the tag that contains the current tag. to the new tag.

Example: Writing an xml document

Typical use to write an xml document: As an example we write an HTML table:

use xml_parser
type(xml_tag),pointer:: tag
      ... set up a string or data ...
      call xml_attribute(tag,'valign','20')
      call xml_attribute(tag,'textcolor','#AAAAAA')
      call xml_add_data(tag,string)
      ... similar ...
    ... etc ...

Example: Reading an xml document

Typical use to read an xml document: Let’s get all the coordinates of a bunch of atoms:

use xml_parser
type(xml_tag),pointer:: tag
real,pointer:: coordinates(:,:)
character(len=...):: atom_name
do while(xml_get_next(tag,'atom')
  do while(xml_get_next(tag))
    if (xml_name(tag)=='coordinates') then
      write(*,*) 'Coordinates of ',atom_name,':',coordinates
    end if
  end do
end do


This file is included in the fortran code and contain settings that fine-tune the performance and layout. The variables are described inside the file.