christophedebatz
christophedebatz

Reputation: 184

How to browse and to display XML content with Java

I have a problem in Java with DOM... Here is the XML code :

<?xml version="1.0" encoding="UTF-8"?>
<bib>
<domain>
    <title>Specifications</title>
    <bib_ref>
        <year>March 2000</year>
        <title>MOF  1.3</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\MOF1_3.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>August 2002</year>
        <title>IDLto Java LanguageMapping Specification</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\IDL2Java.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>1999</year>
        <title>XML Metadata Interchange (XMI) Version 1.1</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\xmi-1.1.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>XML Metadata Interchange (XMI) Version 2</title>
        <author>"OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\XMI2.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>XMI Version 1Production of XML Schema Specification</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\XMI1XSD.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>EDOC</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf</weblink>
    </bib_ref>
</domain>
<domain>
    <title>Theses</title>
    <bib_ref>
        <year>Octobre 2001</year>
        <title>Echanges de Spécifications Hétérogènes et Réparties</title>
        <author>Xavier Blanc</author>
        <weblink>D:\SALIM\Docs\Theses\TheseXavier.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>Janvier 2001</year>
        <title>Composition of Object-Oriented Software Design Models</title>
        <author>Siobhan Clarke</author>
        <weblink>D:\SALIM\Docs\Theses\SClarkeThesis.pdf</weblink>
    </bib_ref>
 ......
 ......

After, in Java main function, I call the dispContent function which is just there:

public void dispContent (Node n) 
{
    
    String domainName = null;
    
    // we are in an element node
    if (n instanceof Element) {
        Element e = ((Element) n);
       
        // domain title
        if (e.getTagName().equals("title") && e.getParentNode().getNodeName().equals("domain")) {
            domainName = e.getTextContent();
            DomaineTemplate(domainName);
        }
        
        else if (e.getTagName().equals("bib_ref")) {
            NodeList ref = e.getChildNodes();

            for (int i = 0; i < ref.getLength(); i++) {
                Node temp = (Node) ref.item(i);
                
                if (temp.getNodeType() == Node.ELEMENT_NODE) {
                    if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                        continue;
                
                    out.println(temp.getNodeName() + " : " + temp.getTextContent() + "\n");
                }
            }
        }
        
        else {
            NodeList sub = n.getChildNodes();
            for(int i=0; (i < sub.getLength()); i++)
                dispContent(sub.item(i));

        }
    }
        /*else if (n instanceof Document) {
        NodeList fils = n.getChildNodes();
        for(int i=0; (i < fils.getLength()); i++) {
            dispContent(fils.item(i));
    
        }
    }*/
}

The "domaineTemplate" function just displays its parameter! My problem happens when I browse the "bib_ref" tag in Java. For each "bib_ref" loop, it displays all the contents of all "bib_ref" tags... in one line! I want to display only one content (year, title, author and weblink tag) per "bib_ref".

Here is what it is displaying at the moment when I browse bib_ref :

Specifications

year : March 2000 title : MOF 1.3 author : OMG weblink : D:\SALIM\Docs\Specifications\MOF1_3.pdf year : August 2002 title : IDLto Java LanguageMapping Specification author : OMG weblink : D:\SALIM\Docs\Specifications\IDL2Java.pdf year : 1999 title : XML Metadata Interchange (XMI) Version 1.1 author : OMG weblink : D:\SALIM\Docs\Specifications\xmi-1.1.pdf year : 2002 title : XML Metadata Interchange (XMI) Version 2 author : OMG weblink : D:\SALIM\Docs\Specifications\XMI2.pdf year : 2002 title : XMI Version 1Production of XML Schema Specification author : OMG weblink : D:\SALIM\Docs\Specifications\XMI1XSD.pdf year : 2002 title : EDOC author : OMG weblink : D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf

Theses

year : Octobre 2001 title : Echanges de Sp�cifications H�t�rog�nes et R�parties author : Xavier Blanc weblink : D:\SALIM\Docs\Theses\TheseXavier.pdf year : Janvier 2001 title : Composition of Object-Oriented Software Design Models author : Siobhan Clarke weblink : D:\SALIM\Docs\Theses\SClarkeThesis.pdf year : Juin 2002 title : Contribution � la repr�sentation de processu par des techniques de m�ta mod�lisation author : Erwan Breton weblink : D:\SALIM\Docs\Theses\ErwanBretonThesis.pdf year : Octobre 2000 title : Technique de Mod�lisation et de M�ta mod�lisation author : Richard Lemesle weblink : D:\SALIM\Docs\Theses\RichardLemesle.pdf year : Juillet 2002 title : Utilsation d'agents mobiles pour la construction des services distribu�s author : Siegfried Rouvrais weblink : D:\SALIM\Docs\Theses\theserouvrais.pdf ... ...

Can you help me ? I'm just a beginner in xml with java and I'm searching some solution for about 3 hours... Thank's a lot!

Upvotes: 1

Views: 247

Answers (2)

daniel
daniel

Reputation: 3174

Of course, now I see you have tagged your question with html and your code has nothing to do with html so far. So I asume out.println is some OutputStream for a Servlet and you're trying to Output html.

So the println linebreak, and the "\n" linebreaks are just available in the html sourcecode. The browser will skip this.

Change this line

out.println(temp.getNodeName() + " : " + temp.getTextContent() + "\n");

to

out.println(temp.getNodeName() + " : " + temp.getTextContent() + "< br />");

and a servlet should output just fine with the linebreaks.

Upvotes: 1

Ryan
Ryan

Reputation: 672

I called dispContent(doc.getFirstChild()); where doc is the Document with your given xml file contents.

Assumptions: out.println() is System.out.println() and DomaineTemplate(domainName); adds a newline (based on your output provided)

I get the following print out in the console:

Specifications

year : March 2000

title : MOF  1.3

author : OMG

weblink : D:\SALIM\Docs\Specifications\MOF1_3.pdf

year : August 2002

title : IDLto Java LanguageMapping Specification

author : OMG

weblink : D:\SALIM\Docs\Specifications\IDL2Java.pdf

year : 1999

title : XML Metadata Interchange (XMI) Version 1.1

author : OMG

weblink : D:\SALIM\Docs\Specifications\xmi-1.1.pdf

year : 2002

title : XML Metadata Interchange (XMI) Version 2

author : "OMG

weblink : D:\SALIM\Docs\Specifications\XMI2.pdf

year : 2002

title : XMI Version 1Production of XML Schema Specification

author : OMG

weblink : D:\SALIM\Docs\Specifications\XMI1XSD.pdf

year : 2002

title : EDOC

author : OMG

weblink : D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf

Theses

year : Octobre 2001

title : Echanges de Spécifications Hétérogènes et Réparties

author : Xavier Blanc

weblink : D:\SALIM\Docs\Theses\TheseXavier.pdf

year : Janvier 2001

title : Composition of Object-Oriented Software Design Models

author : Siobhan Clarke

weblink : D:\SALIM\Docs\Theses\SClarkeThesis.pdf

If you're having an issue with "\n" creating a new line, you can try using what the System uses:

public static final String NEW_LINE = System.getProperty("line.separator");

If you don't want the new lines between each line of the "bib_ref" node's children print outs, change:

else if (e.getTagName().equals("bib_ref")) {
    NodeList ref = e.getChildNodes();

        for (int i = 0; i < ref.getLength(); i++) {
            Node temp = (Node) ref.item(i);

            if (temp.getNodeType() == Node.ELEMENT_NODE) {
                if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                    continue;

                 out.println(temp.getNodeName() + " : " + temp.getTextContent() + "\n");
            }
        }
}

to:

else if (e.getTagName().equals("bib_ref")) {
    NodeList ref = e.getChildNodes();

        for (int i = 0; i < ref.getLength(); i++) {
            Node temp = (Node) ref.item(i);

            if (temp.getNodeType() == Node.ELEMENT_NODE) {
                if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                    continue;

                 // Removed "\n":
                 out.println(temp.getNodeName() + " : " + temp.getTextContent());
            }
        }

        // Added out.println();
        out.println();
}

Results:

Specifications

year : March 2000
title : MOF  1.3
author : OMG
weblink : D:\SALIM\Docs\Specifications\MOF1_3.pdf

year : August 2002
title : IDLto Java LanguageMapping Specification
author : OMG
weblink : D:\SALIM\Docs\Specifications\IDL2Java.pdf

year : 1999
title : XML Metadata Interchange (XMI) Version 1.1
author : OMG
weblink : D:\SALIM\Docs\Specifications\xmi-1.1.pdf

year : 2002
title : XML Metadata Interchange (XMI) Version 2
author : "OMG
weblink : D:\SALIM\Docs\Specifications\XMI2.pdf

year : 2002
title : XMI Version 1Production of XML Schema Specification
author : OMG
weblink : D:\SALIM\Docs\Specifications\XMI1XSD.pdf

year : 2002
title : EDOC
author : OMG
weblink : D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf

Theses

year : Octobre 2001
title : Echanges de Spécifications Hétérogènes et Réparties 
author : Xavier Blanc
weblink : D:\SALIM\Docs\Theses\TheseXavier.pdf

year : Janvier 2001
title : Composition of Object-Oriented Software Design Models
author : Siobhan Clarke
weblink : D:\SALIM\Docs\Theses\SClarkeThesis.pdf

Upvotes: 4

Related Questions