Avatar billede hakio Novice
04. maj 2005 - 20:53 Der er 20 kommentarer og
1 løsning

Bestemme type af en attribut i et DOM tree

Jeg ønsker at vide hvilken type min node (n i nedenstående er) - om det er en String, int eller hvad det nu må være. Er dette overhovedet muligt ?
Jeg skal ikke lave noget med DTD. Jeg skal bruge typen af noden så jeg kan hive værdien ud og gemme den korrekt i en database.

Min kode:

//Get the DOM tree as a Document object
parser.parse(new InputSource(new StringBufferInputStream(returnXMLString)));
Document doc = parser.getDocument();

// Get node to start iterating with
Element root = doc.getDocumentElement();           
NodeList defectElements = root.getElementsByTagName("defect");
Element defect = (Element)defectElements.item(0);
System.out.println("yuppie - " + defectElements.getLength());

//Get a NodeIterator
NodeIterator i = ((DocumentTraversal)doc).createNodeIterator(defect, NodeFilter.SHOW_ALL, null, true);
Node n, attrib;
NamedNodeMap a;

//Do the iteration as long as there a any elements
while ((n = i.nextNode( )) != null) {
  if (n.getNodeType( ) == Node.ELEMENT_NODE) {
      System.out.println("Encountered Element: '" + n.getNodeName() + "'");
  } else if (n.getNodeType( ) == Node.TEXT_NODE) {
      System.out.println("Encountered Text: '" + n.getNodeValue() + "'");
Avatar billede arne_v Ekspert
04. maj 2005 - 20:55 #1
Hvad er der galt med den n.getNodeType() som du allerede bruger ?
Avatar billede hakio Novice
04. maj 2005 - 21:05 #2
Min xml ser sådan herud:
"<?xml version="1.0" encoding="ISO-8859-1"?><defects><defect><defectID >32</defectID>...osv"

Min system.out's giver det her:

"Encountered Element: 'defect'
Encountered Element: 'defectID'
Encountered Text: '32'
Encountered Element: 'subject'
Encountered Text: 'Bug in eventDropDownHandler'...osv"

Som jeg forstår det ser getNodeType() på om det er en NODE i sig selv, eller teksten der står i noden...
Avatar billede kalp Novice
04. maj 2005 - 21:07 #3
int test = 0;

try{
test = dinNode;
//hvis det er et tal vil den køre koden her
}catch(Exception ac)
{
// hvis ikke det var et tal må det være tekst. og så køres kode her.
}

hvis ikke spørgsmålet er misforstået.
Avatar billede kalp Novice
04. maj 2005 - 21:09 #4
ahh ja det jo ikke sikkert man kan.. den brokker sig nok over hvad man prøver at gemme i test.. den forventer tal.

men har prøvet det før hvor jeg ville finde ud af om det var tal jeg eller tekst man indtastede.. og så parsede jeg lige det som skulle gemmes til tekst med Integer klassens parse metode.
Avatar billede arne_v Ekspert
04. maj 2005 - 21:09 #5
Når du står på <defectID> så vil

n.getNodeName() være "defectID"

og

n.getFirstChild().getNodeValue() være "32"
Avatar billede arne_v Ekspert
04. maj 2005 - 21:12 #6
Har du iøvrigt læst http://www.eksperten.dk/artikler/100 ?
Avatar billede hakio Novice
04. maj 2005 - 22:21 #7
hmm... ok - nu har jeg gjort det sådan her så min XML streng indeholder typen. Så skal jeg bare have hevet den attribut ud? :

"<?xml version="1.0" encoding="ISO-8859-1"?><defects><defect><defectID type="int">32</defectID><subject type="String">Bug in eventDropDownHandler</subject><classifying type="String">critical</classifying><parentProduct type="String">3</parentProduct><parentSubProduct type="String">4</parentSubProduct><submittedDate type="Date">2002-04-05</submittedDate><closedDate  type="Date">null</closedDate></defect></defects>"


Hvordan hiver jeg attributten 'type' ud via den kode jeg pastede øverst ?
Avatar billede arne_v Ekspert
04. maj 2005 - 22:29 #8
du kan hente en attribut med

n.getAttributes().getNamedItem("type").getNodeValue()
Avatar billede arne_v Ekspert
04. maj 2005 - 22:30 #9
alternativt kunne du jo teste på om det er et tal

eksempel på metode:

  public static boolean isNumber(String s) {
      if(s.length() <= 0) {
        return false;
      }
      for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if(c != ' ' && !Character.isDigit(c)) {
            return false;
        }
      }
      return true;
  }
Avatar billede hakio Novice
04. maj 2005 - 23:05 #10
Min kode er nu :
-------
while ((n = i.nextNode( )) != null) {
                type = null;
                if (n.getNodeType() == Node.ELEMENT_NODE){
                    System.out.println("Element: '" + n.getNodeName() + "'");
                    type = n.getAttributes().getNamedItem("type").getNodeValue();
                    System.out.println("Type = " + type);
                } else if (n.getNodeType( ) == Node.TEXT_NODE) {
                    System.out.println("Encountered Text: '" + n.getNodeValue() + "'");   
------

og det giver fejlen (output):

------
<?xml version="1.0" encoding="ISO-8859-1"?><defects><defect><defectID type="int">32</defectID><subject type="String">Bug in eventDropDownHandler</subject><classifying type="String">critical</classifying><parentProduct type="String">3</parentProduct><parentSubProduct type="String">4</parentSubProduct><submittedDate type="Date">2002-04-05</submittedDate><closedDate  type="Date">null</closedDate></defect></defects>
Element: 'defect'
java.lang.NullPointerException
    at ambiinfo.soap.client.SoapClient.getTodoListFromServer(SoapClient.java:94)
    at TestClient.main(TestClient.java:21)
Avatar billede hakio Novice
04. maj 2005 - 23:06 #11
linie 94 er
type = n.getAttributes().getNamedItem("type").getNodeValue();
Avatar billede arne_v Ekspert
04. maj 2005 - 23:07 #12
Du kan kun hente den attribut på defectID elementer ikke på defects og defect elementer
Avatar billede hakio Novice
04. maj 2005 - 23:34 #13
nej - det er klart nok for mig. Men bør dette her ikke være ok :

while ((n = i.nextNode( )) != null) {
                type = null;
                if (n.getNodeType() == Node.ELEMENT_NODE){
                    System.out.println("Element: '" + n.getNodeName() + "'");
                } else if (n.getNodeType( ) == Node.TEXT_NODE) {           
                        type = n.getAttributes().getNamedItem("type").getNodeValue();
                        System.out.println("Type = " + type);
                    }                   
                    System.out.println("Encountered Text: '" + n.getNodeValue() + "'");
Avatar billede arne_v Ekspert
04. maj 2005 - 23:35 #14
slet ikke

fordi defectID er en ELEMENT_NODE med en child node som er TEXT_NODE
Avatar billede hakio Novice
04. maj 2005 - 23:35 #15
og der kommer denne fejl her:

java.lang.NullPointerException
Element: 'defect'
Element: 'defectID'
    at ambiinfo.soap.client.SoapClient.getTodoListFromServer(SoapClient.java:95)
    at TestClient.main(TestClient.java:21)
Avatar billede arne_v Ekspert
04. maj 2005 - 23:36 #16
test

if(n.getAttributes().getNamedItem("type")!=null) {
}
Avatar billede hakio Novice
04. maj 2005 - 23:45 #17
else if (n.getNodeType( ) == Node.TEXT_NODE) {           
                    if(n.getAttributes().getNamedItem("type")!=null) {
                        type = n.getAttributes().getNamedItem("type").getNodeValue();
                    }
                    System.out.println("Type = " + type);

Dette gir stadigvæk en nullPointerException. Det er selve
if(n.getAttributes().getNamedItem("type")!=null)
checket der fejler
Avatar billede hakio Novice
04. maj 2005 - 23:48 #18
Jeg kan ikke se hvor i det her jeg gør det helt galt. Føler jeg har stirret mig totalt dum på skidtet.
Avatar billede arne_v Ekspert
04. maj 2005 - 23:50 #19
koden skal op under ELEMENT_NODE
Avatar billede hakio Novice
05. maj 2005 - 01:31 #20
tak... svar du venligst
Avatar billede arne_v Ekspert
05. maj 2005 - 15:13 #21
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester