Oprettet tir. d. 16. august 2011 kl. 22:53:01

RoboForm
RoboForm (4.125 point. Point ude: 60)
Frax.dk

Parse XML til String[]

Hej
Jeg står inde med en XML string, som jeg gerne vil have lavet som til to Sting[]'e.

<?xml version="1.0" encoding="UTF-8"?>
<fql_query_response xmlns="http://api.facebook.com/ (...) xmlns:xsi="http://www.w3.org/ (...) list="true">
<user>
<name>User1</name>
<uid>0001</uid>
</user>
<user>
<name>User2</name>
<uid>0002</uid>
</user>
</fql_query_response>

Jeg har prøvet alt og ved hvert forsøg på at omskrive det får jeg en ny Exception. Da jeg er forholdsvis ny i Java, vil jeg gerne have lidt hjælp. Som udgangspunkt vil jeg gerne stå tilbage med to String[]'s der hver indeholder en variable fra <user>.
F.eks.
String[] names = {User1,User2}
String[] uids = {0001,0002}

Skrevet ons. d. 17. august 2011 kl. 01:59:18| #1

arne_v
arne_v (1.016.169 point)
Der er mange maader at parse den XML paa i Java.

Men her er en W3C DOM XPath loesning:

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XmlParse {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
                  "<fql_query_response>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User1</name>\r\n" +
                  "        <uid>0001</uid>\r\n" +
                  "    </user>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User2</name>\r\n" +
                  "        <uid>0002</uid>\r\n" +
                  "    </user>\r\n" +
                  "</fql_query_response>";
        System.out.println(s);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(s)));
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList users = (NodeList)xpath.evaluate("/fql_query_response/user", doc.getDocumentElement(), XPathConstants.NODESET);
        for(int i = 0; i <users.getLength(); i++) {
            Node user = users.item(i);
            String name = ((Node)xpath.evaluate("name/text()", user, XPathConstants.NODE)).getNodeValue();
            String uid = ((Node)xpath.evaluate("uid/text()", user, XPathConstants.NODE)).getNodeValue();
            System.out.println(name+ " " + uid);
        }
    }
}

Skrevet ons. d. 17. august 2011 kl. 01:59:53| #2

arne_v
arne_v (1.016.169 point)
Jeg ville nok returnere resultatet i en List<User> fremfor 2 String[].

Skrevet ons. d. 17. august 2011 kl. 16:51:56| #3

RoboForm
RoboForm (4.125 point)
Frax.dk
XPath ser ikke ud til at eksistere i mit indbyggede library. Hvor kan den downloades?

Skrevet ons. d. 17. august 2011 kl. 17:04:59| #4

arne_v
arne_v (1.016.169 point)
Hvilken Java version bruger du?

Hvis den er aeldre end 1.5, saa skal du nok hente Xerces.

Skrevet ons. d. 17. august 2011 kl. 17:26:17| #5


Skrevet ons. d. 17. august 2011 kl. 17:51:43| #6

arne_v
arne_v (1.016.169 point)
Saa burde du kunne lave:

import javax.xml.xpath.XPath;

Skrevet ons. d. 17. august 2011 kl. 17:51:58| #7

arne_v
arne_v (1.016.169 point)
Ifoelge http://download.oracle.com/ (...) har de endda vaeret der siden 5.

Skrevet ons. d. 17. august 2011 kl. 20:08:19| #8

RoboForm
RoboForm (4.125 point)
Frax.dk
Ifølge Eclipse MOTODEV findes det ikke i dens library. Javac.xml findes, men ikke xpath.

Skrevet ons. d. 17. august 2011 kl. 20:21:54| #9

arne_v
arne_v (1.016.169 point)
Java ME eller Android?

Skrevet ons. d. 17. august 2011 kl. 21:40:43| #10

RoboForm
RoboForm (4.125 point)
Frax.dk
Android :-) Har endnu ikke oplevet en Java funktion der ikke har været tilgængelig til Android.

Skrevet ons. d. 17. august 2011 kl. 21:48:05| #11

arne_v
arne_v (1.016.169 point)
Ifoelge:

http://developer.android.com/ (...)

skulle de klasser vaere der.

Skrevet ons. d. 17. august 2011 kl. 22:02:56| #12

RoboForm
RoboForm (4.125 point)
Frax.dk
Min app er lavet til API LEVEL 4 or XPATH kræver API LEVEL 8. Da jeg ikke vil opgradere til længere end 7, må jeg finde noget alternativt kode. Har du noget andet kode, der ikke bruger xpath?

Skrevet ons. d. 17. august 2011 kl. 22:12:07| #13

arne_v
arne_v (1.016.169 point)
Ah. Saa giver det hele jo mening.

Der er heldigvis andre muligheder.

Lad mig lave en god gammeldags ren W3C DOM loesning.

15 minutter!

Skrevet ons. d. 17. august 2011 kl. 22:18:55| #14

arne_v
arne_v (1.016.169 point)
package august;

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XmlParse {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
                  "<fql_query_response>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User1</name>\r\n" +
                  "        <uid>0001</uid>\r\n" +
                  "    </user>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User2</name>\r\n" +
                  "        <uid>0002</uid>\r\n" +
                  "    </user>\r\n" +
                  "</fql_query_response>";
        System.out.println(s);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(s)));
        NodeList users = doc.getElementsByTagName("user");
        for(int i = 0; i < users.getLength(); i++) {
            Node user = users.item(i);
            String name = user.getChildNodes().item(1).getFirstChild().getNodeValue();
            String uid = user.getChildNodes().item(3).getFirstChild().getNodeValue();
            System.out.println(name+ " " + uid);
        }
    }
}

Skrevet ons. d. 17. august 2011 kl. 22:19:25| #15

arne_v
arne_v (1.016.169 point)
Bemaerk at 1 og 3 er list "magiske" ved aendringer i XML skal de aendres.

Skrevet ons. d. 17. august 2011 kl. 22:36:01| #16

RoboForm
RoboForm (4.125 point)
Frax.dk
Det er noteret, testet og bekræftet. Jeg siger tusind tak for hjælpen, Arne. Smid du et svar, så får du dine points :-)

Skrevet ons. d. 17. august 2011 kl. 22:41:51| #17


Skrevet fre. d. 19. august 2011 kl. 23:22:09| #18

arne_v
arne_v (1.016.169 point)
Jeg er ikke glad ved de 1 og 3.

Her er en variant som undgaard det men med lidt mere kode:

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XmlParse2 {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
                  "<fql_query_response>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User1</name>\r\n" +
                  "        <uid>0001</uid>\r\n" +
                  "    </user>\r\n" +
                  "    <user>\r\n" +
                  "        <name>User2</name>\r\n" +
                  "        <uid>0002</uid>\r\n" +
                  "    </user>\r\n" +
                  "</fql_query_response>";
        System.out.println(s);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(s)));
        NodeList users = doc.getElementsByTagName("user");
        for(int i = 0; i < users.getLength(); i++) {
            Node user = users.item(i);
            String name = "";
            String uid = "";
            NodeList childs = user.getChildNodes();
            for(int j = 0; j < childs.getLength(); j++) {
                if(childs.item(j).getNodeType() == Node.ELEMENT_NODE
                  && childs.item(j).getNodeName().equals("name")) {
                    name = childs.item(j).getFirstChild().getNodeValue();
                }
                if(childs.item(j).getNodeType() == Node.ELEMENT_NODE
                  && childs.item(j).getNodeName().equals("uid")) {
                      uid = childs.item(j).getFirstChild().getNodeValue();
                }
            }
            System.out.println(name+ " " + uid);
        }
    }
}

Skrevet lør. d. 20. august 2011 kl. 00:22:23| #19

RoboForm
RoboForm (4.125 point)
Frax.dk
Tusind tak for det :-) Verden burde have flere som dig, som alligevel hjælper til, selvom det er case closed.

Skrevet lør. d. 20. august 2011 kl. 01:34:02| #20

arne_v
arne_v (1.016.169 point)
Jeg har en staerk tro paa at tingene skal goers rigtigt.

Og de magiske 1 og 3 var bare ikk den rigtige maade.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

How to try my form spam filter?

Oprettet den 24. maj 2012 kl. 21.07
fredand giver 30 point for svar | Giv et svar »

problemer med at oprette en objekt i en while løkke

Oprettet den 23. maj 2012 kl. 09.59
Driton giver 100 point for svar | Giv et svar »

print funktion

Oprettet den 18. maj 2012 kl. 21.41
changelevel giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger