3. Einfache Programmierbeispiele mit JAXP
2. DOM-Programmierbeispiel:
XML einlesen, Element hinzufügen und neue XML-DateierzeugenDieses Programmierbeispiel erfüllt die gleichenAnforderungen mit JAXP-DOM, wie das weiter unten folgendeProgrammierbeispiel 'ExampleJdomAddWrite.java'mit JDOM erfüllt, um den unterschiedlichenProgrammieraufwand einschätzen zu können. In einer XML-Datei wird ein bestimmtes Element gesucht,dessen Childelement einen bestimmten Text enthält. Vor dieses Element wird ein neues Element plaziert und das
Ergebnis in eine neue XML-Datei gespeichert.
Im gleichen Verzeichnis, wo sich die oben gezeigte
Beispiel-XML-Datei 'MyXmlFile.xml'
befindet, speichern Sie den folgenden Java-Sourcecode unter
dem Namen 'ExampleDomAddWrite.java' und kompilieren
und führen ihn aus mit:
javac ExampleDomAddWrite.java
java ExampleDomAddWrite MyXmlFile.xml NewXmlFile.xml
Button Title "Mein dritter Button"
"Mein neuer Button"
|
Falls Ihr Webbrowser die mit "java"
beginnende Zeile auf zwei Zeilen umgebrochen hat: Bitte
geben Sie diese als eine einzige Kommandozeile ein.
Die Kommandozeilenparameter haben folgende Bedeutung:
Parameter |
Beispiel |
Bedeutung |
<XmlFile> |
MyXmlFile.xml |
Diese XML-Datei wird zu Beginn gelesen |
<NewFile> |
NewXmlFile.xml |
In diese XML-Datei wird das Ergebnis
geschrieben (falls die Suchbedingungen erfüllt
werden) |
<MainElem> |
Button |
Es werden Elemente mit diesem Tag-Namen
gesucht |
<Child> |
Title |
Das gesuchte Element muss ein Child-Element
mit diesem Tag-Namen haben |
<FindVal> |
"Mein dritter Button" |
Das Child-Element muss diesen Text als
Inhalt haben |
<New> |
"Mein neuer Button" |
Nur wenn die vorhergehenden Suchbedingungen
erfüllt sind, wird ein neues Element mit diesem
Child-Element-Inhalt vor das gefundene Element
eingefügt |
Mit der Beispiel-XML-Datei 'MyXmlFile.xml'
und den angegebenen Beispielparametern wird das dritte <Button>-Element
gefunden, da dessen <Title>-Text mit der
Suchvorgabe <FindVal>="Mein dritter
Button" übereinstimmt. Vor dieses <Button>-Element
wird ein neues <Button>-Element mit dem
angegebenen <Title>-Text <New>="Mein
neuer Button" eingefügt. Das Ergebnis wird in die
Datei 'NewXmlFile.xml' gespeichert, allerdings in
wenig schöner Formatierung. Eine schönere Formatierung ist
leicht mit JDOM realisierbar, wie die weiter unten gezeigten
'JDOM-Programmierbeispiele'
demonstrieren.
Wenn Sie aus dem vorherigen Beispiel die Hilfsmethode 'printNodesFromList()'
zu diesem Beispiel hinzufügen, können Sie an zwei Stellen
die Kommentarzeichen '//'
vor diesen Methodenaufrufen entfernen. Dann bekommen Sie die
Knotenstruktur vor und nach der Änderung direkt im
Kommandozeilenfenster angezeigt.
Das Programm funktioniert nur mit einfachen XML-Dateien.
Erforderliche Erweiterungen wären Unterstützung von
Namespaces und XML-Schemas.
// ExampleDomAddWrite.java
import java.io.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class ExampleDomAddWrite
{
public static void main( String[] argv )
{
if( argv.length != 6 )
{
System.err.println( "Usage:" );
System.err.println( "java ExampleDomAddWrite <XmlFile> <NewFile>"
+ " <MainElem> <Child> <FindVal> <New>" );
System.err.println( "Example:" );
System.err.println( "java ExampleDomAddWrite MyXmlFile.xml NewXmlFile.xml"
+ " Button Title \"Mein dritter Button\""
+ " \"Mein neuer Button\"" );
System.exit( 1 );
}
try {
// ---- Parse XML file ----
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// factory.setNamespaceAware( true );
// factory.setValidating( true );
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse( new File( argv[0] ) );
Node rootNode = document.getDocumentElement();
// ---- Get list of nodes to given tag ----
NodeList ndList = document.getElementsByTagName( argv[2] );
// System.out.println( "\nNode list at the beginning:" );
// printNodesFromList( ndList );
// ---- Loop through the list of main nodes ----
for( int i=0; i<ndList.getLength(); i++ )
{
Node nodeMain = ndList.item( i );
Node nodeChild = null;
NodeList ndListChilds = nodeMain.getChildNodes();
boolean bChildFound = false;
if( null == ndListChilds ) continue;
// Loop through the list of child nodes
for( int j=0; j<ndListChilds.getLength(); j++ )
{
nodeChild = ndListChilds.item( j );
if( null == nodeChild ) continue;
String sNodeName = nodeChild.getNodeName();
if( null == sNodeName ) continue;
if( sNodeName.equals( argv[3] ) )
{
bChildFound = true;
break;
}
}
if( !bChildFound ) continue;
Node nodeData = nodeChild.getFirstChild();
if( null == nodeData ||
!(nodeData instanceof org.w3c.dom.Text) ) continue;
String sData = nodeData.getNodeValue();
if( null == sData ||
!sData.equals( argv[4] ) ) continue;
// ---- Create a new node element and insert it ----
Node newMainNode = document.createElement( argv[2] );
Node newChildNode = document.createElement( argv[3] );
Text newTextNode = document.createTextNode( argv[5] );
newChildNode.appendChild( newTextNode );
newMainNode.appendChild( newChildNode );
rootNode.insertBefore( newMainNode, nodeMain );
rootNode.normalize();
// System.out.println( "Node list after modification:" );
// printNodesFromList( ndList );
break;
}
// ---- Use a XSLT transformer for writing the new XML file ----
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source = new DOMSource( document );
FileOutputStream os = new FileOutputStream( new File( argv[1] ) );
StreamResult result = new StreamResult( os );
transformer.transform( source, result );
// ---- Error handling ----
} catch( TransformerConfigurationException tce ) {
System.out.println( "\n** Transformer Factory error" );
System.out.println( " " + tce.getMessage() );
Throwable e = ( tce.getException() != null ) ? tce.getException() : tce;
e.printStackTrace();
} catch( TransformerException tfe ) {
System.out.println( "\n** Transformation error" );
System.out.println( " " + tfe.getMessage() );
Throwable e = ( tfe.getException() != null ) ? tfe.getException() : tfe;
e.printStackTrace();
} catch( SAXParseException spe ) {
System.out.println( "\n** Parsing error, line " + spe.getLineNumber()
+ ", uri " + spe.getSystemId() );
System.out.println( " " + spe.getMessage() );
Exception e = ( spe.getException() != null ) ? spe.getException() : spe;
e.printStackTrace();
} catch( SAXException sxe ) {
Exception e = ( sxe.getException() != null ) ? sxe.getException() : sxe;
e.printStackTrace();
} catch( ParserConfigurationException pce ) {
pce.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();
}
}
}
|
|