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>
}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/
Veikkaan ongelman olevan siinä koodissa, joka rakentaa NodeList:n ja välittää sen tuolle metodille.
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.
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?
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.
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.