Uploaded image for project: 'XalanJ2'
  1. XalanJ2
  2. XALANJ-741

Attlist.getValue and getIndex do not work

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Resolution: Fixed
    • 2.2.x
    • None
    • Other
    • None
    • Operating System: Other
      Platform: Other
    • 5496

    Description

      This problem with getValue has been looked at by Joe Kesselmann who wrote:
      ======Joe's mail=====================================================
      Looking at getValue: It's miscoded. It assumes that the matching attribute
      will be found and immediately tries to convert it to a string, rather than
      stopping to check whether the match might have failed and returned null.
      return ((Attr) m_attrs.getNamedItem(localName)).getValue();

      Actually, that's badly miscoded; it also isn't using the namespace-aware
      call, which is why the search failed in the first place. Changing it to
      Node a=m_attrs.getNamedItemNS(uri,localName);
      return (a==null) ? null : a.getNodeValue();
      cures the problem. This also avoids the typecast overhead, which should
      save us a cycle or two.

      Definite bug, trivial fix. I'll check it in.
      =======================end Joe's mail=======================

      =======================how to reproduce both problems============
      To reproduce the problem: run the main() function in the class JaxpTest2
      passing as an argument the name of a file which contains the following text:

      <?xml version="1.0" encoding="UTF-8"?>
      <deleted xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:enc="http://www.w3.org/2001/06/soap-encoding"
      xsi:type="B1">0</deleted>

      The JaxpTest2 tries to access the attributes of the root via a small handler
      called TestHandler. The call to getIndex() which expects to retrieve the local
      name 'type' actually returns the attribute with local name 'enc'. The call to
      getValue() causes a NullPointer exception:
      java.lang.NullPointerException
      java.lang.String org.apache.xml.utils.AttList.getValue
      (java.lang.String, java.lang.String)
      void jaxp.test.TestHandler.startElement(java.lang.String,
      java.lang.String, java.lang.String, org.xml.sax.Attributes)
      void org.apache.xalan.transformer.TransformerIdentityImpl.startElement
      (java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
      void org.apache.xml.utils.TreeWalker.startNode(org.w3c.dom.Node)
      void org.apache.xml.utils.TreeWalker.traverse(org.w3c.dom.Node)
      void org.apache.xalan.transformer.TransformerIdentityImpl.transform
      (javax.xml.transform.Source, javax.xml.transform.Result)
      void jaxp.test.JaxpTest2.main(java.lang.String[])
      ================================JaxpTest2=====================

      // Copyright (c) 2001 Brooks Automation
      package jaxp.test;

      import javax.xml.parsers.*;
      import javax.xml.transform.*;
      import javax.xml.transform.sax.*;
      import javax.xml.transform.dom.*;
      import javax.xml.transform.stream.*;
      import org.xml.sax.helpers.*;
      import org.xml.sax.*;
      import org.w3c.dom.*;
      import java.io.*;
      /**

      • A Class class.
      • <P>
      • @author Jan Hrabowski
        */
        public class JaxpTest2 extends Object {

      /**

      • Constructor
        */
        public JaxpTest2() {
        }

      /**

      • main
      • @param args
        */
        public static void main(String[] args)
        throws TransformerConfigurationException,
        ParserConfigurationException,
        FileNotFoundException,
        IOException,
        SAXException,
        TransformerException,
        UnsupportedEncodingException { DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); dfactory.setNamespaceAware(true); DocumentBuilder docBuilder = dfactory.newDocumentBuilder(); Node doc = docBuilder.parse(new InputSource(args[0])); TransformerFactory transformerfactory = TransformerFactory.newInstance(); Transformer transformer = transformerfactory.newTransformer(); DOMSource domSource = new DOMSource(doc); SAXResult saxResult = new SAXResult(new TestHandler()); transformer.transform(domSource, saxResult); }

        }

      ============================TestHandler===============================
      // Copyright (c) 2001 Brooks Automation
      package jaxp.test;
      import org.xml.sax.Attributes;
      import org.xml.sax.SAXException;
      import org.xml.sax.helpers.DefaultHandler;

      /**

      • A Class class.
      • <P>
      • @author Jan Hrabowski
        */
        public class TestHandler extends DefaultHandler {

      /**

      • Constructor
        */
        public TestHandler() {
        }

      public void startElement(String namespaceURI,
      String sName, // simple name (localName)
      String qName, // qualified name
      Attributes attrs)
      throws SAXException
      {
      try

      { int i = attrs.getIndex("http://www.w3.org/2001/XMLSchema-instance", "type"); System.out.println("local name=" + attrs.getLocalName(i)); String s = attrs.getValue("http://www.w3.org/2001/XMLSchema-instance", "type"); }

      catch (Exception e)

      { e.printStackTrace(); }

      }
      }

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            jhrabows@brooks.com Jan Hrabowski
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment