[jdom-interest] StringIndexOutOfBoundsException in SaxHandler

Bradley S. Huffman bshuffman at gmail.com
Tue Jul 28 14:25:48 PDT 2009


But http://xml.org/sax/features/namespace-prefixes is set to true in
SAXBuilder (along with http://xml.org/sax/features/namespaces), so my
understanding is getQName() should never be "".  If its a unprefixed
name, then getQName() should be returning the same as getLocalName().
In this case "version".

I can't remember, can you turn either of those SAX features off in SAXBuilder?

Brad

On Tue, Jul 28, 2009 at 11:54 AM, S. Seide<ml-jdom at seide.st> wrote:
> Hello,
>
> using jdom 1.1.1 on android 1.5 gives an
> StringIndexOutOfBoundsException. Androids default XML-Parser ExPat
> returns for Attributes without namespace an emtpy qname:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <config version="2009-07-23" summary="main AVF configuration file">
> </config>
>
> atts.getLocalName(i) - "version"
> atts.getQName(i) - ""
>
> This seems to be the expected behavior, since
> http://www.saxproject.org/apidoc/org/xml/sax/Attributes.html#getQName(int)
> says getQName returns an empty string if no qualified name is available:
>
> getQName
> public java.lang.String getQName(int index)
> Look up an attribute's XML qualified (prefixed) name by index.
>
> Parameters:
> index - The attribute index (zero-based).
> Returns:
> The XML qualified name, or the empty string if none is available, or
> null if the index is out of range.
>
> StackTrace:
>
>> 07-28 14:54:10.354: ERROR/Global(725): java.lang.StringIndexOutOfBoundsException
>> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.String.substring(String.java:1571)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXHandler.startElement(SAXHandler.java:568)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:145)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.append(Native Method)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:506)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:518)
>> 07-28 14:54:10.354: ERROR/Global(725):     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:865)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFGlobal.addInputStreams(AVFGlobal.java:538)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFGlobal.initialize(AVFGlobal.java:630)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.AVFMain.init(AVFMain.java:122)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.tlabs.avf.test.AVFMainTest.onCreate(AVFMainTest.java:78)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.os.Handler.dispatchMessage(Handler.java:99)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.os.Looper.loop(Looper.java:123)
>> 07-28 14:54:10.354: ERROR/Global(725):     at android.app.ActivityThread.main(ActivityThread.java:3948)
>> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.reflect.Method.invokeNative(Native Method)
>> 07-28 14:54:10.354: ERROR/Global(725):     at java.lang.reflect.Method.invoke(Method.java:521)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
>> 07-28 14:54:10.354: ERROR/Global(725):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
>> 07-28 14:54:10.354: ERROR/Global(725):     at dalvik.system.NativeStart.main(Native Method)
>
> patch attached - adding this simple check my xml document is parsed
> successfully on android 1.5.
>
> regards,
> S. Seide
>
>
> diff -ur src/java/org/jdom/input/SAXHandler.java src_patch/java/org/jdom/input/SAXHandler.java
> --- src/java/org/jdom/input/SAXHandler.java     2009-07-28 17:46:40.703125000 +0200
> +++ src_patch/java/org/jdom/input/SAXHandler.java       2009-07-28 17:31:06.546875000 +0200
> @@ -564,7 +564,7 @@
>             // patch from Mattias Jiderhamn
>             if ("".equals(attLocalName) && attQName.indexOf(":") == -1) {
>                 attribute = factory.attribute(attQName, atts.getValue(i), attType);
> -            } else if (!attQName.equals(attLocalName)) {
> +            } else if (!attQName.equals(attLocalName) && attQName.length()>0) {
>                 String attPrefix = attQName.substring(0, attQName.indexOf(":"));
>                 Namespace attNs = Namespace.getNamespace(attPrefix,
>                                                          atts.getURI(i));
>
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>



More information about the jdom-interest mailing list