I tried that meanwhile ;-) and it "works". But this is the stream that comes
directly from the Google Reader service and the standard SDK works with it.
But that means parsing each line ... or writing my own decorator to clean it
up, wouldn't it.
static Document parseXMLfromInputStream(InputStream is, Context context)
throws ParserConfigurationException, FactoryConfigurationError, IOException,
SAXException {
Timing t = U.startTiming("parseXMLFromInputStream");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is,
"UTF-8"), 8 * 1024);
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line.replaceAll("]]>", "]]>") + "\n");
}
bufferedReader.close();
//PrintWriter pw = new PrintWriter(new
FileWriter("/data/data/com.newsrob/files/test.output.xml"));
//pw.print(sb);
//pw.close();
//BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"),
8 * 1024);
//BufferedReader br = new BufferedReader(new
FileReader("/data/data/com.newsrob/files/test.output.xml"));
Document d = null;
try {
d = builder.parse(new InputSource(new StringReader(sb.toString())));
} catch (SAXParseException e) {
Log.e(TAG, "Exception during parsing:", e);
Intent i = new Intent();
i.setClass(context, ShowGoogleErrorActivity.class);
[..]
}
//br.close();
t.stop();
return d;
}
On Wed, Apr 22, 2009 at 4:43 PM, Streets Of Boston <[email protected]>
wrote:
>
> First try to change your test-case.
> Instead of "]]>", do "]]>", just to be sure :-)
>
>
> On Apr 22, 10:40 am, Mariano Kamp <[email protected]> wrote:
>> Ok,
>>
>> I have a smaller test case now:
>>
>> DocumentBuilder builder =
>> DocumentBuilderFactory.newInstance().newDocumentBuilder();
>> String in = "<category term=\"<![CDATA[ Work
in progress
>> ]]>\"><test/></category>";
>> Document d = builder.parse(new InputSource(new
StringReader(in)));
>> System.out.println("OK? => "
>> +
(d.getDocumentElement().getElementsByTagName("test").getLength() == 1));
>>
>> It works with the Standard SDK, but not on Android. The full code is
>> below this post.
>>
>> Standard SDK:
>> mariano-kamps-macbook-pro:~ mkamp$
>> /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java
>> -version
>> java version "1.5.0_16"
>> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
>> Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)
>>
>> Result: OK? => true
>>
>> With Android:
>>
>> W/System.err( 5135): org.xml.sax.SAXParseException: Illegal: ]]>
>> (position:START_TAG <category term='null'>@1:49 in
>> java.io.stringrea...@433eee78)
>> W/System.err( 5135): at
>>
org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:151)
>> W/System.err( 5135): at
test.xml.TestActivity.onCreate(TestActivity.java:23)
>> W/System.err( 5135): at
>>
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)
>> W/System.err( 5135): at
>>
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2103)
>> W/System.err( 5135): at
>> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2156)
>> W/System.err( 5135): at
>> android.app.ActivityThread.access$1800(ActivityThread.java:112)
>> W/System.err( 5135): at
>> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1580)
>> W/System.err( 5135): at
android.os.Handler.dispatchMessage(Handler.java:88)
>> W/System.err( 5135): at android.os.Looper.loop(Looper.java:123)
>> W/System.err( 5135): at
>> android.app.ActivityThread.main(ActivityThread.java:3742)
>> W/System.err( 5135): at java.lang.reflect.Method.invokeNative(Native
Method)
>> W/System.err( 5135): at
java.lang.reflect.Method.invoke(Method.java:515)
>> W/System.err( 5135): at
>>
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
>> W/System.err( 5135): at
>> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
>> W/System.err( 5135): at dalvik.system.NativeStart.main(Native Method)
>> I/ActivityManager( 58): Displayed activity test.xml/.TestActivity: 537
ms
>>
>> Cheers,
>> Mariano
>>
>> Full code goes here.
>>
>> Standard SDK:
>>
>> import java.io.StringReader;
>>
>> import javax.xml.parsers.DocumentBuilder;
>> import javax.xml.parsers.DocumentBuilderFactory;
>>
>> import org.w3c.dom.Document;
>> import org.xml.sax.InputSource;
>>
>> public class Test {
>>
>> public static void main(String[] args) throws Exception {
>> try {
>> DocumentBuilder builder =
>> DocumentBuilderFactory.newInstance().newDocumentBuilder();
>> String in = "<category term=\"<![CDATA[ Work
in progress
>> ]]>\"><test/></category>";
>> Document d = builder.parse(new InputSource(new
StringReader(in)));
>> System.out.println("OK? => "
>> +
(d.getDocumentElement().getElementsByTagName("test").getLength() == 1));
>>
>> } catch (Exception e) {
>> // TODO Auto-generated catch block
>> e.printStackTrace();
>> }
>> }
>>
>> }
>>
>> Android:
>>
>> package test.xml;
>>
>> import java.io.StringReader;
>>
>> import javax.xml.parsers.DocumentBuilder;
>> import javax.xml.parsers.DocumentBuilderFactory;
>>
>> import org.w3c.dom.Document;
>> import org.xml.sax.InputSource;
>>
>> import android.app.Activity;
>> import android.os.Bundle;
>>
>> public class TestActivity extends Activity {
>> /** Called when the activity is first created. */
>> @Override
>> public void onCreate(Bundle savedInstanceState) {
>> super.onCreate(savedInstanceState);
>> setContentView(R.layout.main);
>> try {
>> DocumentBuilder builder =
>> DocumentBuilderFactory.newInstance().newDocumentBuilder();
>> String in = "<category term=\"<![CDATA[ Work
in progress
>> ]]>\"><test/></category>";
>> Document d = builder.parse(new InputSource(new
StringReader(in)));
>> System.out.println("OK? => "
>> +
(d.getDocumentElement().getElementsByTagName("test").getLength() == 1));
>>
>> } catch (Exception e) {
>> // TODO Auto-generated catch block
>> e.printStackTrace();
>> }
>> }
>>
>>
>>
>> }
>> On Wed, Apr 22, 2009 at 3:55 PM, Mariano Kamp <[email protected]>
wrote:
>> > Hey,
>>
>> > thanks for showing an interest!
>>
>> > No, it's not the whole XML and I should have mentioned that.
>>
>> > I'll send you the complete file (92k) by mail. But the offending part
>> > is in here.
>>
>> > Cheers,
>> > Mariano
>>
>> > On Wed, Apr 22, 2009 at 3:51 PM, Streets Of Boston
>> > <[email protected]> wrote:
>>
>> >> If your example is the entire XML you try to parse, then the exception
>> >> is valid.
>> >> Here is the snippet i tried:
>>
>> >> <category term="user/xyz/state/com.google/reading-list"
scheme="http://
>> >>www.google.com/reader/" label="reading-list"/>
>> >> <category term="user/xyz/state/com.google/fresh" scheme="http://
>> >>www.google.com/reader/" label="fresh"/>
>> >> <category term="<![CDATA[ Agenda ]]>"/>
>>
>> >> taken from your post.
>>
>> >> Your example is not a valid XML document: It is missing a root-
>> >> element.
>> >> This would be valid:
>>
>> >> <some_root_elm>
>> >> <category term="user/xyz/state/com.google/reading-list"
>> >> scheme="http://www.google.com/reader/" label="reading-list"/>
>> >> <category term="user/xyz/state/com.google/fresh" scheme="http://
>> >>www.google.com/reader/" label="fresh"/>
>> >> <category term="<![CDATA[ Agenda ]]>"/>
>> >> </some_root_elm>
>>
>> >> When I tried to paste your example in an XML editor, i got a similar
>> >> error that you got in your DOM parser. The fact that ']]>' is
>> >> mentioned may be because it is the last thing parsed in your XML
>> >> snippet.
>>
>> >> Try to put a root-element as the parent of your three category
>> >> elements and see if you still get the problem.
>>
>> >> On Apr 22, 8:08 am, Mariano Kamp <[email protected]> wrote:
>> >>> Hi,
>>
>> >>> yesterday I bitched about all the issues I have with the kXML
>> >>> parser. (
http://groups.google.com/group/android-developers/browse_thread/threa...)
>>
>> >>> So now I converted my code to use DOM. And I tried the third
example
>> >>> from my referenced mail and it gives me an exception too.
>>
>> >>> I get a SAXParseExeption when parsing an atom feed from Google
Reader:
>>
>> >>> org.xml.sax.SAXParseException: Illegal: ]]> (position:START_TAG
>> >>> <category term='user/xyz/state/com.google/fresh'>@5:15061 in
>> >>> java.io.bufferedrea...@4348a0e8)
>> >>> at
org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:151)
>> >>> at com.newsrob.U.parseXMLfromInputStream(U.java:45)
>> >>> at
com.newsrob.EntriesRetriever.fetchNewEntries(EntriesRetriever.java:299)
>> >>> at
com.newsrob.SynchronizationService$4.run(SynchronizationService.java:172)
>> >>> at
com.newsrob.SynchronizationService.doSync(SynchronizationService.java:337)
>> >>> at
com.newsrob.SynchronizationService.access$0(SynchronizationService.java:86)
>> >>> at
com.newsrob.SynchronizationService$1.run(SynchronizationService.java:75)
>> >>> at java.lang.Thread.run(Thread.java:935)
>>
>> >>> I think the problem originates here (see the last category tag):
>>
>> >>> <category term="user/xyz/state/com.google/reading-list"
>> >>> scheme="http://www.google.com/reader/"
label="reading-list"/><category
>> >>> term="user/xyz/state/com.google/fresh"
>> >>> scheme="http://www.google.com/reader/" label="fresh"/><category
>> >>> term="<![CDATA[ Agenda ]]>"/>
>>
>> >>> Any idea why this happens?
>>
>> >>> This is the (abbreviated) code I use to parse the stream from Google
Reader.
>>
>> >>> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
>> >>> dbf.setCoalescing(true); // added this later with no effect
>>
>> >>> DocumentBuilder builder = dbf.newDocumentBuilder();
>>
>> >>> BufferedReader br = new BufferedReader(new
>> >>> InputStreamReader(is,"UTF-8"), 8 * 1024);
>> >>> builder.parse(new InputSource(br));
>>
>> >>> Any help is appreciated.
>>
>> >>> Is there a third parser on Android, besides Harmony's SAXParser and
>> >>> kXML's Pull Parser?
>>
>> >>> Cheers,
>> >>> Mariano- Hide quoted text -
>>
>> - Show quoted text -
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---