fork download
  1. import javax.xml.bind.*;
  2. import javax.xml.bind.annotation.*;
  3. import javax.xml.bind.annotation.adapters.*;
  4. import java.io.*;
  5. import java.util.*;
  6.  
  7. @XmlRootElement(name="myroot")
  8. @XmlAccessorType(XmlAccessType.NONE)
  9. class SO19509130d {
  10.  
  11. private String id;
  12. private Properties props = new Properties();
  13.  
  14. @XmlAttribute public String getId() { return id; }
  15. public void setId(String id) { this.id = id; }
  16.  
  17. @XmlElement(name="property")
  18. public Collection<XmlProperty> getProperties() {
  19. return new XmlProperties(props);
  20. }
  21.  
  22. @XmlType(name="property") static class XmlProperty {
  23. @XmlAttribute public String key;
  24. @XmlValue public String value;
  25. }
  26.  
  27. static class XmlProperties extends AbstractCollection<XmlProperty> {
  28. private final Properties props;
  29. public XmlProperties(Properties props) { this.props = props; }
  30. public int size() { return props.size(); }
  31. public Iterator<XmlProperty> iterator() {
  32. return new XmlPropertyIterator(props.entrySet().iterator());
  33. }
  34. public boolean add(XmlProperty xml) {
  35. return !xml.value.equals(props.setProperty(xml.key, xml.value));
  36. }
  37. }
  38.  
  39. static class XmlPropertyIterator implements Iterator<XmlProperty> {
  40. private final Iterator<Map.Entry<Object, Object>> base;
  41. public XmlPropertyIterator(Iterator<Map.Entry<Object, Object>> base) {
  42. this.base = base;
  43. }
  44. public boolean hasNext() { return base.hasNext(); }
  45. public void remove() { base.remove(); }
  46. public XmlProperty next() {
  47. Map.Entry<?, ?> entry = base.next();
  48. XmlProperty xml = new XmlProperty();
  49. xml.key = entry.getKey().toString();
  50. xml.value = entry.getValue().toString();
  51. return xml;
  52. }
  53. }
  54.  
  55. public static void main(String[] args) throws Exception {
  56. SO19509130d obj = new SO19509130d();
  57. obj.id = "theID";
  58. obj.props.setProperty("key1", "val1");
  59. obj.props.setProperty("key2", "val2");
  60. JAXBContext ctx = JAXBContext.newInstance(SO19509130d.class);
  61. Marshaller m = ctx.createMarshaller();
  62. Unmarshaller u = ctx.createUnmarshaller();
  63. m.marshal(obj, baos);
  64. InputStream bais = new ByteArrayInputStream(baos.toByteArray());
  65. obj = (SO19509130d)u.unmarshal(bais);
  66. m.marshal(obj, System.out);
  67. System.out.println();
  68. }
  69. }
  70.  
Success #stdin #stdout 0.25s 381824KB
stdin
Standard input is empty
stdout
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myroot id="theID"><property key="key2">val2</property><property key="key1">val1</property></myroot>