Avatar billede Slettet bruger
16. august 2011 - 22:53 Der er 19 kommentarer og
1 løsning

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/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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}
Avatar billede arne_v Ekspert
17. august 2011 - 01:59 #1
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);
        }
    }
}
Avatar billede arne_v Ekspert
17. august 2011 - 01:59 #2
Jeg ville nok returnere resultatet i en List<User> fremfor 2 String[].
Avatar billede Slettet bruger
17. august 2011 - 16:51 #3
XPath ser ikke ud til at eksistere i mit indbyggede library. Hvor kan den downloades?
Avatar billede arne_v Ekspert
17. august 2011 - 17:04 #4
Hvilken Java version bruger du?

Hvis den er aeldre end 1.5, saa skal du nok hente Xerces.
Avatar billede Slettet bruger
17. august 2011 - 17:26 #5
Jeg kører JRE 6
Avatar billede arne_v Ekspert
17. august 2011 - 17:51 #6
Saa burde du kunne lave:

import javax.xml.xpath.XPath;
Avatar billede arne_v Ekspert
17. august 2011 - 17:51 #7
Avatar billede Slettet bruger
17. august 2011 - 20:08 #8
Ifølge Eclipse MOTODEV findes det ikke i dens library. Javac.xml findes, men ikke xpath.
Avatar billede arne_v Ekspert
17. august 2011 - 20:21 #9
Java ME eller Android?
Avatar billede Slettet bruger
17. august 2011 - 21:40 #10
Android :-) Har endnu ikke oplevet en Java funktion der ikke har været tilgængelig til Android.
Avatar billede arne_v Ekspert
17. august 2011 - 21:48 #11
Avatar billede Slettet bruger
17. august 2011 - 22:02 #12
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?
Avatar billede arne_v Ekspert
17. august 2011 - 22:12 #13
Ah. Saa giver det hele jo mening.

Der er heldigvis andre muligheder.

Lad mig lave en god gammeldags ren W3C DOM loesning.

15 minutter!
Avatar billede arne_v Ekspert
17. august 2011 - 22:18 #14
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);
        }
    }
}
Avatar billede arne_v Ekspert
17. august 2011 - 22:19 #15
Bemaerk at 1 og 3 er list "magiske" ved aendringer i XML skal de aendres.
Avatar billede Slettet bruger
17. august 2011 - 22:36 #16
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 :-)
Avatar billede arne_v Ekspert
17. august 2011 - 22:41 #17
svar
Avatar billede arne_v Ekspert
19. august 2011 - 23:22 #18
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);
        }
    }
}
Avatar billede Slettet bruger
20. august 2011 - 00:22 #19
Tusind tak for det :-) Verden burde have flere som dig, som alligevel hjælper til, selvom det er case closed.
Avatar billede arne_v Ekspert
20. august 2011 - 01:34 #20
Jeg har en staerk tro paa at tingene skal goers rigtigt.

Og de magiske 1 og 3 var bare ikk den rigtige maade.
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