Question

I am trying to parse an xml file but Malformedurlexception occurs. Do you have any idea why it is happening?

note: in first code segment there is a line as comment system.out.println(requestXml) it is working (the xml content is coming right as string) but i want to parse it but parse method is not working.

Code

String requestXml = "";

try {
    String argUrl = "http://192.168.1.25:3480/data_request?id=sdata&output_format=xml";

    URL url = new URL(argUrl);
    URLConnection con = url.openConnection();
    // specify that we will send output and accept input
    con.setDoInput(true);
    con.setDoOutput(true);

    con.setConnectTimeout(20000);  // long timeout, but not infinite
    con.setReadTimeout(20000);

    con.setUseCaches(false);
    con.setDefaultUseCaches(false);

    // tell the web server what we are sending
    con.setRequestProperty("Content-Type", "text/xml");

    OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
    writer.write(requestXml);
    writer.flush();
    writer.close();

    // reading the response
    InputStreamReader reader = new InputStreamReader(con.getInputStream());

    StringBuilder buf = new StringBuilder();
    char[] cbuf = new char[2048];
    int num;

    while (-1 != (num = reader.read(cbuf))) {
        buf.append(cbuf, 0, num);
    }
    requestXml = buf.toString();
    xmlParser(requestXml);

    //System.out.println(requestXml);

} catch (Throwable t) {
    t.printStackTrace(System.out);
}
return requestXml;

and xmlParser method is:

protected void xmlParser(String xmlToBeParsed) {

    try {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(xmlToBeParsed);
        doc.getDocumentElement().normalize();
        NodeList nodes = doc.getElementsByTagName("devices");

        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);

            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                System.out.println("Stock Symbol: " + getValue("device name", element));

            }
        }

    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

private static String getValue(String tag, Element element) {
    NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
    Node node = (Node) nodes.item(0);
    return node.getNodeValue();
}  

the log is:

04-30 11:55:21.299: W/System.err(826): java.net.MalformedURLException: Protocol not found: 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.299: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): 04-30 11:55:21.309: W/System.err(826): at java.net.URL.(URL.java:178) 04-30 11:55:21.309: W/System.err(826): at java.net.URL.(URL.java:127) 04-30 11:55:21.309: W/System.err(826): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:115) 04-30 11:55:21.319: W/System.err(826): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:155) 04-30 11:55:21.319: W/System.err(826): at com.example.eos.SensorDataConnector.xmlParser(SensorDataConnector.java:93) 04-30 11:55:21.319: W/System.err(826): at com.example.eos.SensorDataConnector.getXMLData(SensorDataConnector.java:71) 04-30 11:55:21.319: W/System.err(826): at com.example.eos.EnergyOptimizer$5.onClick(EnergyOptimizer.java:148) 04-30 11:55:21.319: W/System.err(826): at android.view.View.performClick(View.java:4204) 04-30 11:55:21.319: W/System.err(826): at android.view.View$PerformClick.run(View.java:17355) 04-30 11:55:21.319: W/System.err(826): at android.os.Handler.handleCallback(Handler.java:725) 04-30 11:55:21.319: W/System.err(826): at android.os.Handler.dispatchMessage(Handler.java:92) 04-30 11:55:21.319: W/System.err(826): at android.os.Looper.loop(Looper.java:137) 04-30 11:55:21.319: W/System.err(826): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-30 11:55:21.319: W/System.err(826): at java.lang.reflect.Method.invokeNative(Native Method) 04-30 11:55:21.319: W/System.err(826): at java.lang.reflect.Method.invoke(Method.java:511) 04-30 11:55:21.319: W/System.err(826): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-30 11:55:21.319: W/System.err(826): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-30 11:55:21.329: W/System.err(826): at dalvik.system.NativeStart.main(Native Method)

Was it helpful?

Solution

What you are using to parse the XML is this method:

public Document parse(String uri) throws SAXException, IOException

It basically expect an uri from which to fetch the content. This is not your case, because you already have queried the URL and parsed the contents. You are not supplying what the method expects.

I think you should be all right if you skip all the reading of the connection input stream and just do:

InputStream input = con.getInputStream();
xmlParser(input);

Note I have removed many lines. And then:

protected void xmlParser(InputStream input)
{

    try {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(input);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top