Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does this code keep triggering the SaxParseException : ""PI must not start with xml"?

This code is used to generate a XML document from its String representation. It works fine in my small unit tests, but fails in my actual xml data. The line where it triggers is Document doc = db.parse(is);

Any ideas?

public static Document FromString(String xml)
{
    // from http://www.rgagnon.com/javadetails/java-0573.html
    try
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(xml));

        Document doc = db.parse(is);
        doc.normalize();

        return doc;
    }
    catch (Exception e)
    {
        Log.WriteError("Failed to parse XML", e, "XML.FromString(String)");
        return null;
    }
}
like image 975
Kurru Avatar asked Feb 14 '11 01:02

Kurru


4 Answers

Thanks for your help everyone.

I discarded the <?xml version="1.0" encoding="utf-8"?> which cleared this error. Still don't understand what the reason for this might be, but it worked nonetheless.

I went on to find one of my buffered writers (when extracting from a zip file into memory) wasn't being flushed, which was causing the xml string to be incomplete.

Thanks everyone for your help!

like image 89
Kurru Avatar answered Sep 20 '22 19:09

Kurru


You may check if your xml file has BOM header

like image 3
shaobin0604 Avatar answered Sep 23 '22 19:09

shaobin0604


I had the same problem while parsing XML generated by PHP. After I added the ContentType header "text/xml" it works like a charm.

like image 3
Timo Bakx Avatar answered Sep 21 '22 19:09

Timo Bakx


as @StaxMan said, remove any unknown characters before

responseBody = responseBody.substring(responseBody.indexOf("<"));

like image 2
jowett Avatar answered Sep 20 '22 19:09

jowett