Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: XML-tiedon tulostaminen [Java]

Zmyrgel [02.04.2009 23:27:08]

#

Tarkoituksena olisi DOM-parserin avulla tulostaa xml-tiedostosta elementit ja niiden arvot. Tällä hetkellä saan kyllä ohjelman tulostamaan elementtien nimet mutta niiden arvoja se ei suostu tulostamaan vaan ohjelma antaa niiksi vain nullia. Millä tuon alla olevan metodin saisi tulostamaan nuo fullscreen ja name tagien arvotkin?

private void printParts(NodeList nlist) throws Exception {
     // print just node names
     StringBuffer nb = new StringBuffer();
     StringBuffer vb = new StringBuffer();
     StringBuffer cb = new StringBuffer();
     StringBuffer ab = new StringBuffer();
     for (int i = 0; i <= nlist.getLength(); i++) {
          try {
               if (nlist.item(i).getNodeName() != null) nb.append( nlist.item(i).getNodeName()  + " " );

               // check if attributes present
               if (nlist.item(i).hasAttributes()) {
                    NamedNodeMap attributes = nlist.item(i).getAttributes();
                    //print attributes by name/value
                    for (int j = 0; j < attributes.getLength(); j++) {
                         ab.append(" {");
                         ab.append(" name:" + attributes.item(j).getNodeName());
                         ab.append(" value:" + attributes.item(j).getNodeValue());
                         ab.append(" }");
                    }
               }
               if (nlist.item(i).getNodeValue() != null) vb.append( nlist.item(i).getNodeValue() + " " );
               if (nlist.item(i).getNodeName() != null && nlist.item(i).getNodeValue() != null) cb.append("[" +nlist.item(i).getNodeName()  + "]='"+nlist.item(i).getNodeValue()+"'");
          }catch(NullPointerException e) {
          }
     }

     System.out.println("Names: "      + nb.toString() );
     System.out.println("Attributes: " + ab.toString() );
     System.out.println("Values: "     + vb.toString() );
     System.out.println("Custom: "     + cb.toString() );
     // print just node values
     // print node name and values in new format
}

Tulostaa seuraavaa:

     [java] 1. Create object model
     [java] 2. Print tree information
     [java] 3. Add new element
     [java] 4. Change info
     [java] 5. Write to file
     [java] 6. Print parts
     [java] 7. Quit
6
     [java] Names: screen general font transparency borderwidth tags app name tag app name tag rules app name fullscreen
     [java] Attributes:  { name:xmlns value:http://wickedbsd.net } { name:xmlns:xsi value:http://www.w3.org/2001/XMLSchema-instance } { name:xsi:schemaLocation value:http://wickedbsd.net file:///media/nfs/dom/lab.xsd }
     [java] Values:
     [java] Custom:

Ja tältä näyttää XML-tiedosto:

<?xml version="1.0"?>
<screen
xmlns="http://wickedbsd.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://wickedbsd.net lab.xsd">
    <general>
        <font>terminus</font>
        <transparency>1</transparency>
        <borderwidth>2</borderwidth>
    </general>
    <tags>
        <app>
            <name>MPlayer</name>
            <tag>1</tag>
        </app>
        <app>
            <name>Terminal</name>
            <tag>2</tag>
        </app>
    </tags>
    <rules>
        <app>
            <name>MPlayer</name>
            <fullscreen>1</fullscreen>
        </app>
    </rules>
</screen>

Jackal von ÖRF [03.04.2009 00:31:21]

#

}catch(NullPointerException e) {
}

0_o

Ota tuo nyt ainakin pois. Muutoin jää yksi bugiluokka huomaamatta.

Elementtien sisällä oleva teksti on DOM:ssa tuultavasti Text-tyyppisinä Node:ina. http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html

Veikkaan ongelman olevan siinä koodissa, joka rakentaa NodeList:n ja välittää sen tuolle metodille.

Zmyrgel [03.04.2009 10:12:20]

#

Juu, olen tuota JDK:n Node sivua pällistellyt ja todennut että joku Text-tyyppi siellä on mutta en ollut niillä tiedoilla oikein saanut tuota etenemään.

Zmyrgel [03.04.2009 12:42:58]

#

Katselin debuggerilla tuota hieman ja nlist:in sisältö on seuraava:

[[screen: null], [general: null], [font: null], [transparency: null], [borderwidth: null], [tags: null], [app: null], [name: null], [tag: null], [app: null], [name: null], [tag: null], [rules: null], [app: null], [name: null], [fullscreen: null]]

Olettaisin että tuossa pitäisi esimerkiksi tuossa font tagin jälkeen lukea terminus eikä null mikä kielisi että ongelmana on tuo nlistin muodostus vai olenko käsittänyt väärin?

Jackal von ÖRF [03.04.2009 13:16:30]

#

Tuossa printParts-metodissa ei näytä olevan ongelmia, vaan ongelma on siinä koodissa, joka kutsuu printParts-metodia. Näytä se koodi, joka rakentaa tuon nlist:n.

EDIT: Kokeilepa, mitä nlist.item(i).getFirstChild() palauttaa. Ehkä siinä on kyseinen teksti-elementti. Siinä tapauksessa ei tarvitse muuttaa printParts-metodia kutsuvaa koodia.

Zmyrgel [04.04.2009 20:56:07]

#

Jackal von ÖRF kirjoitti:

Tuossa printParts-metodissa ei näytä olevan ongelmia, vaan ongelma on siinä koodissa, joka kutsuu printParts-metodia. Näytä se koodi, joka rakentaa tuon nlist:n.

EDIT: Kokeilepa, mitä nlist.item(i).getFirstChild() palauttaa. Ehkä siinä on kyseinen teksti-elementti. Siinä tapauksessa ei tarvitse muuttaa printParts-metodia kutsuvaa koodia.

Jeps, tuo getFirstChild() auttoi asiaa ja sain nuo tekstit esiin. Vieläkin pieniä pulmia koodissa mutta enköhän tästä selviä itse eteenpäin. Kiitoksia tärpistä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta