JAXB returns null for attributes with a namespace
java, jaxb
Solution
Below is an example of how to specify the `namespace` property on the `@XmlAttribute` annotation.
input.xml
<article xmlns:xlink="http://www.w3.org/1999/xlink">
<license xlink:href="http://creativecommons.org/licenses/by/2.0/uk/"/>
</article>
License
package forum10566766;
import javax.xml.bind.annotation.XmlAttribute;
public class License {
private String href;
@XmlAttribute(namespace="http://www.w3.org/1999/xlink")
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
}
Article
package forum10566766;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Article {
private License license;
public License getLicense() {
return license;
}
public void setLicense(License license) {
this.license = license;
}
}
Demo
package forum10566766;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Article.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum10566766/input.xml");
Article article = (Article) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(article, System.out);
}
}
Output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<article xmlns:ns1="http://www.w3.org/1999/xlink">
<license ns1:href="http://creativecommons.org/licenses/by/2.0/uk/"/>
</article>
Want to Control the Namespace Prefixes?
If you want to control the namespace prefixes used when the document is marshalled to XML check out the following article:
- http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html
Problem
I need to unmarshall an XML that has namespaces for the attributes, for instance ``` <license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/2.0/uk/"><license-p> ``` This attribute is defined as ``` @XmlAttribute(namespace = "http://www.w3.org/TR/xlink/") @XmlSchemaType(name = "anySimpleType") protected String href; ``` But when I try to retrieve the href, it is null. What should I add/modify to the jaxb code in order to get the right value? I already tried to avoid namespaces but it did not work, still null. I also tried with `@XmlAttribute(namespace = "http://www.w3.org/TR/xlink/", name = "href")` but it did not work either. The top of the XML file is: ``` <DOCTYPE article PUBLIC "-//NLM//DTD v3.0 20080202//EN" "archive.dtd"> <article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" article-type="article"> ```