My favorites | Sign in
Project Logo
                
Code license: Apache License 2.0
Labels: java, xml, xpath, dynamic, proxy, annotation
Feeds:
People details
Project owners:
  raykrueger

XPathProxy is a means of generating proxy instances in java of annotated interfaces to access Dom Elements via XPath.

It allows you to access XML like this...

<?xml version="1.0" encoding="UTF-8"?>
<s:Test xmlns:s="http://www.example.com/xml">
  <s:someString>Hello</s:someString>
  <s:anotherString sneaky='boo'>World</s:anotherString>
  <s:booleanExists/>
  <s:booleanTrue>true</s:booleanTrue>
  <s:booleanFalse>false</s:booleanFalse>
  <s:someDouble>123.456</s:someDouble>
  <s:yes>YES</s:yes>
</s:Test>

With an interface like this... (note that the YesNo below is a java5 Enum type)

@NamespaceMapping(prefix = "s", uri = "http://www.example.com/xml")
public interface Sample {

    @XPathMethod("/s:Test/s:someString")
    String getHello();

    @XPathMethod("/s:Test/s:anotherString[@sneaky=$0]")
    String getWorld(String sneaky);

    @XPathMethod("/s:Test/s:booleanExists")
    Boolean booleanExists();

    @XPathMethod("/s:Test/s:doesNotExist")
    Boolean booleanDoesNotExist();

    @XPathMethod("/s:Test/s:booleanTrue")
    Boolean booleanTrueValue();

    @XPathMethod("/s:Test/s:booleanFalse")
    Boolean booleanFalseValue();

    @XPathMethod("/s:Test/s:yes")
    YesNo yesNo();

    @XPathMethod("/s:Test/s:someDouble")
    Double doubleValue();
}

Instantiate the proxy with code like this...

XPathProxyFactory<Sample> factory = new XPathProxyFactory<Sample>(Sample.class);
factory.registerConverter(new EnumConverter(YesNo.class));
Sample proxy = factory.createProxy(requestElement);
System.out.println(proxy.getHello());

The above would print "Hello" as that is the result of the xpath query annotated on that method.

What XPathProxy does is essentially wrap a given DOM Node with an annotated interface for easy access.









Hosted by Google Code