Article:
  Parsing an XML Document with XPath
Subject:   Parsing a Namespace node with JDK 5.0
Date:   2005-01-14 08:23:02
From:   dvohra09
To parse a namespace node with the JDK 5.0 javax.xml.xpath package, set the NamespaceContext on the XPath object.



XPath xpath;
NamespaceContext namepsaceContext=new NamespaceContextImpl();
xpath.setNamespaceContext(namespaceContext);


For a NamespaceContext object, create a class which implements the NamespaceContext interface.



private class NamespaceContextImpl implements NamespaceContext{


public String uri;
public String prefix;


public String getUri(){
return uri;
}
public void setUri(String uri){
this.uri=uri;
}


public String getPrefix(){
return prefix;
}


public void setPrefix(String prefix){
this.prefix=prefix;
}



}


Full Threads Oldest First

Showing messages 1 through 6 of 6.

  • Parsing a Namespace node with JDK 5.0
    2005-02-17 07:55:52  Gerg [View]

    Thanks for the examples. Could you please also show an example of an xpath that includes two different namespaces prefixes? If a journal's article could be in different languages, you might want to add an "xml:lang" attribute to the "article" element. (Where the "xml" prefix in XML documents implicitly refers to the "http://www.w3.org/XML/1998/namespace" namespace without being explicitly declared as such with an "xmlns" attribute in the root element - as I understand it.) Presumably, the xpath expression to return the value of that attribute would be "/catalog/journal:journal/article/@xml:lang". In such an expression it would seem that we need to xpath.setNamespaceContext(NamespaceContextImpl) twice, with two different NamespaceContextImpl instances, one for each prefix ("journal" and "xml"). For me, though, evaluating this expression returns nothing, even if I use a NamespaceContextImpl class (or two). Hmmmmmm.
    • Parsing a Namespace node with JDK 5.0
      2005-02-17 08:01:53  Deepak Vohra | [View]

      Develop an implementation class of the NamespaceContext interface with the provision to set more than one prefixes for a uri.

      import javax.xml.namespace.NamespaceContext;
      import java.util.Iterator;
      import java.util.Map;
      import java.util.HashMap;
      import java.util.Set;
      import java.util.ArrayList;
      import java.util.List;

      public class MyNamespaceContext implements NamespaceContext {
      private Map map;

      public MyNamespaceContext() {
      map = new HashMap();
      }

      public void setNamespace(String prefix, String namespaceURI) {
      map.put(prefix, namespaceURI);
      }

      public String getNamespaceURI(String prefix) {
      return (String) map.get(prefix);
      }

      public String getPrefix(String namespaceURI) {
      Set keys = map.keySet();
      for (Iterator iterator = keys.iterator(); iterator.hasNext();)
      {
      String prefix = (String) iterator.next();
      String uri = (String) map.get(prefix);
      if (uri.equals(namespaceURI)) return prefix;
      }
      return null;
      }

      public Iterator getPrefixes(String namespaceURI) {
      List prefixes = new ArrayList();
      Set keys = map.keySet();
      for (Iterator iterator = keys.iterator(); iterator.hasNext();)
      {
      String prefix = (String) iterator.next();
      String uri = (String) map.get(prefix);
      if (uri.equals(namespaceURI)) prefixes.add(prefix);
      }
      return prefixes.iterator();
      }
      }

      • Parsing a Namespace node with JDK 5.0
        2005-02-18 02:16:18  Gerg [View]

        Thanks, that works like a charm!
        • Parsing a Namespace node with JDK 5.0
          2006-02-22 09:15:26  Gerg [View]

          I'm getting an unexplanatory XPathExpressionException when I evaluate the following xpath

          /xhtml:html/xhtml:body//xhtml:div[@class='reviewlist']

          after setting a namespace context

          NamespaceContextImpl nsctx = new NamespaceContextImpl();
          nsctx.setNamespaceURI("xml", "http://www.w3.org/XML/1998/namespace");
          nsctx.setNamespaceURI("xhtml", "http://www.w3.org/1999/xhtml");
          xpath.setNamespaceContext(nsctx);

          The source XML document is an XHTML web page with its root element being declared as belonging to http://www.w3.org/1999/xhtml namespace:

          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
          <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

          I can't see anything wrong with the xpath expression, nor can I find any documentation explaining why an XPathExpressionException would be thrown in this case.

          Could you tell any possisble causes for the exception being thrown?

          Thanks.
  • Parsing a Namespace node with JDK 5.0
    2005-01-14 08:38:33  Deepak Vohra | [View]

    Include the interface methods in the implementation class.

    An implementation of NamespaceContext with a single prefix corresponding to a namespace uri.

    public class NamespaceContextImpl implements NamespaceContext{

    public String uri;
    public String prefix;

    public NamespaceContextImpl(){}

    public NamespaceContextImpl(String prefix, String uri){
    this.uri=uri;
    this.prefix=prefix;
    }

    public String getNamespaceURI(String prefix){
    return uri;
    }
    public void setNamespaceURI(String uri){
    this.uri=uri;
    }

    public String getPrefix(String uri){
    return prefix;
    }

    public void setPrefix(String prefix){
    this.prefix=prefix;
    }
    public Iterator getPrefixes(String uri){return null;}

    }

    • Parsing a Namespace node with JDK 5.0
      2005-01-14 08:56:42  Deepak Vohra | [View]

      XPath xpath;
      NamespaceContext namepsaceContext=new NamespaceContextImpl(prefix, uri);
      xpath.setNamespaceContext(namespaceContext);




      public class NamespaceContextImpl implements NamespaceContext{
      public String uri;
      public String prefix;
      public NamespaceContextImpl(){}
      public NamespaceContextImpl(String prefix, String uri){
      this.uri=uri;
      this.prefix=prefix;
      }
      public String getNamespaceURI(String prefix){
      return uri;
      }
      public void setNamespaceURI(String uri){
      this.uri=uri;
      }
      public String getPrefix(String uri){
      return prefix;
      }
      public void setPrefix(String prefix){
      this.prefix=prefix;
      }
      public Iterator getPrefixes(String uri){return null;}
      }