Yeah, that's not what I mean by a test case.

See http://junit.org as a starting point.
(The Android SDK includes some limited version of JUnit I don't
recognize. It's adequate for this purpose, but the full, modern
version is better. For non-device testing, you're not restricted to
the supplied one.)

Basically, a test case is code that you can run to *automatically*
test some specific aspect of a system. In this case, checking against
a known set of XML (so it doesn't change), looking for the known
desired result, and reporting failures (expected conditions not
matching) and errors (unexpected exceptions thrown).

This removes the variables from the equation. You're not depending on
how things display, either in the UI nor in the log stream and
windows. You're not dependent on a human to notice a problem.

An best of all, you can automate it to always run when you build, so
if you break later, you'll find out right away, while you know what
you changed. And you can make changes freely, with the security of
knowing that you won't have to go through some long test/debug cycle.

I didn't answer your question about getting a stacktrace earlier,
because you said "NetBeans". I'm old enough to remember when NetBeans
was the hot new thing -- but too old to remember how to do anything
with it. Try using Eclipse and the ADK. It will show you the stack
trace in the same way it shows any other stack trace, as if you were
debugging locally. (I would expect NetBeans to, as well).

Or you can catch the exception, and use exception.printStackTrace() to
get it into the log (I'm surprised it's not already there).

This isn't really an Android problem, and it's not necessary to debug
it there. If you write your failing test cases, you can debug them on
your desktop computer, get them working, and you should be set to go
on the device.

Another thing to realize is that not all character values you can come
up with, are legal XML content. They *MUST* be valid printing Unicode
characters. No random control characters -- for example, ISO-8859-1
byte values 0-31 (decimal). This will ALWAYS fail -- it is NOT well-
formed XML. If that's the cause of your exceptions, your two choices
would be to fix it on the server (probably by encoding this binary
data) or to preprocess the fake-XML into real XML before you feed it
to the XML parser.

\
On Feb 3, 6:49 am, MobDev <[email protected]> wrote:
> well to begin with : thx for the expalanation :D
> I was wondering about your statement :
> "Try logging to a file. Or better yet, create test cases, and verify
> the correct operation of your code via test suite, rather than via log
> statements. "
> I already tried in a test case, which was to write the incoming data
> to a AlertDialog, but the result was that those characters are shwon
> on-screen with a rectangle with a ? in it... My idea (and test case)
> would be to "stream" a list of countries, and afterwards show this
> list onscreen so the user can select one...
> Our problem is that the whole system I am using is based on the ISO
> norm and cannot be changed to UTF-8 in a short period of time...
> Or am I misinterpreting your "test cases" and "test suite" ? And if so
> how should it have been interpreted ?
>
> On 3 feb, 13:26, Bob Kerns <[email protected]> wrote:
>
>
>
> > Well, you found one way to get the encoding in there. A few more:
>
> > InputSource.setEncoding("iso-8859-1")
> > new InputStreamReader(stream, "iso-8859-1");
>
> > I'd argue that it should have gotten it from the ?<xml...
> > encoding="iso-8859-1"?> -- I'm a bit surprised it didn't. But it's
> > something I'd never rely on if I know the encoding.
>
> > Anyway, re: your problem below. It's probably working right, up to the
> > point of the log statement.
>
> > The log stream is probably taking those bytes, and then later they're
> > being interpreted as UTF-8. or it's taking the characters from the
> > string, and interpreting them as UTF-8 (via String.getBytes()) and
> > passing them off to a log stream that doesn't know about UTF-8.
>
> > Try logging to a file. Or better yet, create test cases, and verify
> > the correct operation of your code via test suite, rather than via log
> > statements.
>
> > But if you have any control or influence over the server -- fix the
> > problem there. ISO-8859-* should be of purely historical interest in
> > interpreting old documents. The first draft of ISO-10646 came out
> > nearly 20 years ago, and UTF-8 has been around for nearly 18 years.
> > The world is international. It's time to put a stake in the heart of
> > these national encodings.
>
> > On Feb 3, 2:55 am, MobDev <[email protected]> wrote:
>
> > > Btw I also have tried this instead :
>
> > >  try {
> > >                 URL url = new URL("http://www.myserver.com/xmlstream";);
> > >                 URLConnection conn = url.openConnection();
> > >             InputStream is = conn.getInputStream();
> > >             Xml.parse(is, Xml.Encoding.ISO_8859_1, new ExampleHandler
> > > ());
> > >         } catch (Exception e)
> > >         {
> > >             throw new RuntimeException(e);
> > >         }
>
> > > This time it wont just crash but for example if I print the output
> > > (through Log) I get
>
> > > Found attribute : Ã…land eilanden
> > > and
> > > Found attribute : Albanië instead of Albanié
>
> > > So any input on this ?
>
> > > On 3 feb, 10:44, MobDev <[email protected]> wrote:
>
> > > > Actually this is the code for the second approach :
>
> > > > /* Create a URL we want to load some xml-data from. */
> > > > URL url = new URL("http://www.myserver.com/xmlstream";);
>
> > > > /* Get a SAXParser from the SAXPArserFactory. */
> > > > SAXParserFactory spf = SAXParserFactory.newInstance();
> > > > SAXParser sp = spf.newSAXParser();
>
> > > >  /* Get the XMLReader of the SAXParser we created. */
> > > > XMLReader xr = sp.getXMLReader();
> > > >  /* Create a new ContentHandler and apply it to the XML-Reader*/
> > > > ExampleHandler myExampleHandler = new ExampleHandler();
> > > > xr.setContentHandler(myExampleHandler);
>
> > > > /* Parse the xml-data from our URL. */
> > > > xr.parse(new InputSource(url.openStream()));
> > > > /* Parsing has finished. */
>
> > > > And the error I get is :
> > > > At line 40, column 23: not well-formed (invalid token)
>
> > > > which is around this XML line :
> > > > <Country ID="2" CName="Åland eilanden"/>
>
> > > > So where should I specifiy its an ISO-8859-1 ?
> > > > Also I have been debugging the app, but I actually cannot see the
> > > > stacktrace, could you please direct me on how to show it on NetBeans ?
> > > > Every time I try to look at the exception thrown I will see several
> > > > variables but StackTrace will be null...
>
> > > > On 3 feb, 06:17, Bob Kerns <[email protected]> wrote:
>
> > > > > While I would expect your second approach to work, it's important to
> > > > > note that IT IS NOT REQUIRED TO WORK.
>
> > > > > The XML standard does not require XML processors to support anything
> > > > > other than UTF-8 or UTF-16.
>
> > > > > In this day and age, I would STRONGLY discourage use of anything other
> > > > > than UTF-8, or, rarely, UTF-16.
>
> > > > > Another factor to consider is how you're getting access to those
> > > > > characters. You must do this one of two ways:
>
> > > > > 1) Using a Reader set to read 8859-1
> > > > > -or-
> > > > > 2) Using an input stream, giving the raw bytes to the parser, letting
> > > > > it decode the 8859-1 characters.
>
> > > > > You WILL FAIL (and this is probably your problem, would be my guess)
> > > > > if you try to read using a Reader that's expecting UTF-8.
>
> > > > > A stacktrace should show which problem you have.
>
> > > > > On Feb 2, 6:42 am, MobDev <[email protected]> wrote:
>
> > > > > > Hi,
> > > > > > I am downloading a xml-type file from a webserver which starts out
> > > > > > with :
>
> > > > > > <?xml version="1.0" encoding="iso-8859-1" ?>
>
> > > > > > afterwards I get a list with loads of countries, some countries do
> > > > > > contain some letters like é and á.
>
> > > > > > I have tried to extract the data of the xml in two ways :
> > > > > > 1 - simply download the whole thing into a String, which will result
> > > > > > in those characters being seen as something like [] or on the 
> > > > > > Android
> > > > > > emulator (and device) I will see a triangle with a ? in it...
>
> > > > > > 2 - fetch the list with the SAXParser and XMLReader which will just
> > > > > > throw an exception telling me that there is some content error...
> > > > > > specifically at the line where the first country is with such a
> > > > > > character...
>
> > > > > > So is there some way to get this to work ? Can I read the iso-8859-1
> > > > > > encoded xml into the Parser ? Or is there some way to encode/decode
> > > > > > the received data into something actually usable ?
> > > > > > Any idea where the problem might be ?
>
> > > > > > Thanks in advance for any hints, tips, code or explanation :D

-- 
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

Reply via email to