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.

Use the -xml option when running pamadm for the modules to be compiled.

Usage

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
!
tag=>open('xmlfile')
do while(xml_tag_next(tag,'grid'))
  do while(xml_tag_next(tag))
    ... code ...
  end do
end do
tag=>xml_close('xmlfile')
  • 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 ...
char_data=>xml_get_data(tag)
real_data=>xml_get_data(tag)
... 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
!
tag=>xml_open('mydoc.xml')
tag=>xml_tag_open(tag,'table')
  tag=>xml_tag_open(tag,'tr')
    tag=>xml_tag_open(tag,'td')
      ... set up a string or data ...
      call xml_attribute(tag,'valign','20')
      call xml_attribute(tag,'textcolor','#AAAAAA')
      call xml_add_data(tag,string)
    tag=>xml_tag_close(tag)
    tag=>xml_tag_open(tag,'td')
      ... similar ...
    tag=>xml_tag_close(tag)
    ... etc ...
  tag=>xml_tag_close(tag)
tag=>xml_tag_close(tag)
xml_write('mydoc.xml')
xml_close('mydoc.xml')

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
!
tag=>xml_open('mydoc.xml')
tag=>xml_read('mydoc.xml')
do while(xml_get_next(tag,'atom')
  atom_name=xml_attribute(tag,'name')
  do while(xml_get_next(tag))
    if (xml_name(tag)=='coordinates') then
      coordinates=>xml_get_data(tag)
      write(*,*) 'Coordinates of ',atom_name,':',coordinates
    end if
  end do
end do
xml_close('mydoc.xml')

xml_settings.h

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.