我是JAXB的新手,一开始我正在编组一些简单的Java文件,比如 Hello, world! .
Hello, world!
我想编组整个文件,即使我的注释行放置如下:
/* * some comment */ //another comment
并在注释块中以XML格式获取它们:
<!-- some comment --> <!-- another comment -->
有没有办法用注释来编组java文件?
您的用例需要克服几个障碍:
注释不存储在类的字节代码中,因此您需要在其他地方使用它们 .
JAXB API不提供映射到内容节点的方法 .
话虽如此,下面是一个可能适用于您的方法:StAX与JAXB并利用 Marshaller.Listener .
Marshaller.Listener
Customer
import javax.xml.bind.annotation.*; @XmlRootElement @XmlType(propOrder={"name", "address"}) @XmlAccessorType(XmlAccessType.FIELD) public class Customer { private String name; private Address address; public Customer() { } public Customer(String name, Address address) { this.name = name; this.address = address; } }
Address
import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Address { String street; public Address() { } public Address(String street) { this.street = street; } }
MyMarshalListener
import javax.xml.bind.Marshaller; import javax.xml.stream.*; public class MyMarshallerListener extends Marshaller.Listener { private XMLStreamWriter xsw; public MyMarshallerListener(XMLStreamWriter xsw) { this.xsw = xsw; } @Override public void beforeMarshal(Object source) { try { xsw.writeComment("Before: " + source.toString()); } catch(XMLStreamException e) { // TODO: handle exception } } @Override public void afterMarshal(Object source) { try { xsw.writeComment("After: " + source.toString()); } catch(XMLStreamException e) { // TODO: handle exception } } }
Demo
import javax.xml.bind.*; import javax.xml.stream.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Address address = new Address("123 A Street"); Customer customer = new Customer("Jane", address); XMLOutputFactory xof = XMLOutputFactory.newFactory(); XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out); Marshaller marshaller = jc.createMarshaller(); marshaller.setListener(new MyMarshallerListener(xsw)); marshaller.marshal(customer, xsw); xsw.close();; } }
Real Output
<?xml version="1.0" ?><!--Before: forum26802450.Customer@18de9738--><!--Before: forum26802450.Customer@18de9738--><customer><name>Jane</name><!--Before: forum26802450.Address@43e47e37--><address><street>123 A Street</street><!--After: forum26802450.Address@43e47e37--></address><!--After: forum26802450.Customer@18de9738--></customer><!--After: forum26802450.Customer@18de9738-->
Formatted Output
以下是输出的格式:
<?xml version="1.0" ?> <!--Before: forum26802450.Customer@18de9738--> <!--Before: forum26802450.Customer@18de9738--> <customer> <name>Jane</name> <!--Before: forum26802450.Address@43e47e37--> <address> <street>123 A Street</street> <!--After: forum26802450.Address@43e47e37--> </address> <!--After: forum26802450.Customer@18de9738--> </customer> <!--After: forum26802450.Customer@18de9738-->
1 回答
您的用例需要克服几个障碍:
注释不存储在类的字节代码中,因此您需要在其他地方使用它们 .
JAXB API不提供映射到内容节点的方法 .
话虽如此,下面是一个可能适用于您的方法:StAX与JAXB并利用
Marshaller.Listener
.Java模型
Customer
Address
演示代码
MyMarshalListener
Demo
Real Output
Formatted Output
以下是输出的格式: