If you work with XML files, it's not too easy to use the right parser because there are many of them and, if you want a simple parser without writing a lot of source code, you need some luck.

We added two classes to JVx that solves simple XML handling.

Example

XML file:

simple.xml
<?xml version="1.0" encoding="UTF-8"?>
 
<!-- Before begin! -->
<server>
 
  <leer/>
  <leer></leer>
 
  <!-- Test: STARTPORT -->
  <startport>2001</startport>
 
  <audio>off</audio>
  <serial>COM1</serial>
  <buttondelay>1000</buttondelay>
 
  <media>
    <directory>C:\Temp\smedia</directory>
  </media>
 
  <!-- Test: TCP information 
      second row
      third row
 
 after an empty row
 -->
  <tcp>
    <bindaddress>0.0.0.0</bindaddress>
    <user>user</user>
    <pwd>password</pwd>
  </tcp>
 
  <db>
    <name>SERVER_1</name>
    <path>c:\temp\pbxdb</path>
    <user>user</user>
    <pwd>password</pwd>
  </db>
 
  <report name="Standard">
    <fontdirectory>C:\temp\pdffonts</fontdirectory>
    <format>pdf</format>
  </report>
 
  <report name="User">
    <fontdirectory>C:\temp\xlsfonts</fontdirectory>
    <format>xls</format>
  </report>
 
  <text>
  Hans
    <comment>Comment</comment>
  Huber
    <comment2>Comment2</comment2>
  Pauli
  </text>
 
  <text>This is a text
from Hansi Huber
  </text>
 
</server>
<!--  After End -->

Read/Insert/Set tags:

XmlWorker xmw = new XmlWorker();
XmlNode xmn = xmw.read("simple.xml");
 
//----------------------------
// Read nodes
//----------------------------
 
//Access a single TAG
xmn.getNodeValue("/server/media");
//Access a TAG from a list
xmn.getNodeValue("/server/report(1)/format")
 
//----------------------------
// Insert new nodes
//----------------------------
 
//quick inserts
xmn.insertNode("/server/report(0)", null);
xmn.setNode("/server/report(0)/format", "ABC");
 
xmn.insertNode("/server/startport(1)", "ABCD");
 
//with nodes
XmlNode xmnInsert = new XmlNode("ABCD");
 
xmnInsAttrib  = new XmlNode(XmlNode.TYPE_ATTRIBUTE, "attrib1", xmnInsert);
xmnInsAttrib.setValue("Attribut");
 
xmn.insertNode("/server/startport(1)", xmnInsert);
 
//----------------------------
// Set nodes
//----------------------------
 
xmn.setNode("/server/domain", "www.domain.com")
 
//----------------------------
// Save
//----------------------------
 
xmn.write("simple_new.xml", xmn);

It's easy to access and modify information in an XML file. We use '/' as separator for navigating through the hierarchy and (n) to access tags from a list of tags.

There are more useful methods, e.g., find the index of a tag in a list of tags. The following example creates a XML structure in memory.

XmlNode xmn = XmlNode.createXmlDeclaration();
 
xmn.insertNode("/server/a/b/c", "A");
xmn.insertNode("/server/a/b/c", "B");
xmn.insertNode("/server/a/b/c", "A");
xmn.insertNode("/server/a/b/c", "B");
xmn.insertNode("/server/a/b/c", "A");
xmn.insertNode("/server/a/b(1)/c", "A");
xmn.insertNode("/server/a/b/b", "A");
 
XmlNode xmnSearch = xmnRead.getNode("/server/a/b(0)"); 
 
//returns 0
xmnSearch.indexOf("/c", "A", 0);
//returns 2
xmnSearch.indexOf("/c", "A", 1);
//returns 3
xmnSearch.indexOf("/c", "A", 3);
//returns 0
xmnSearch.indexOf("/b", "A", 0);
 
xmn.insertNode("/server/a/b(1)/1", "A");
xmn.insertNode("/server/a/b(2)/2", "A");
xmn.insertNode("/server/a(1)/b/3", "A");
 
//returns 0
xmn.indexOf("/server/a/b/b", "A", 0)

The <XmlNode>.toString() method returns the XML representation of the node and all subnodes.