如何使用JAXB保留XML注释?

时间:2014-09-08 04:24:47

标签: java jaxb marshalling unmarshalling

如何在不丢失注释的情况下解组和编组XML文件? 有没有办法使用JAXB,我尝试使用以下link的示例 但它不起作用。

    <customer>
        <address>
    <!--   comments line 1 -->
           <street>1 Billing Street</street>
        </address>
        <address>
    <!-- comments line 2-->
        <street>2 Shipping Road</street>
       </address>
</customer>

我想解组上面的xml,为它添加一个新地址并对其进行编组,而不会丢失以下注释。

<!--   comments line 1 -->
   <!-- comments line 2-->

3 个答案:

答案 0 :(得分:0)

您可以将JAXB与StAX结合使用来访问尾随注释。

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("pathOfYourXML/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);

        JAXBContext jc = JAXBContext.newInstance(Customer.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer xml = (Customer) unmarshaller.unmarshal(xsr);

        while(xsr.hasNext()) {
            if(xsr.getEventType() == XMLStreamConstants.COMMENT) {
                System.out.println(xsr.getText());
            }
            xsr.next();
        }
    }

}

答案 1 :(得分:0)

也许更容易调整/扩展客户地址的(数据)模型。

<customer>
  <billing-address>
    <street></street>
    <street></street>
    <city></city>
  </billing-address>
  <shipping-address>
    <street></street>
    <street></street>
    <street></street>
    <city></city>
  </shipping-address>
</customer>

这样,语义在模型中不会在评论中“隐藏”。

答案 2 :(得分:0)

为了使用您提供的示例将

@Hareesh保留在XML文件中,您需要使用DOM(文档对象模型)读取和写入XML文件,而不是JAXB(如示例中)。但是,可以使用javax.xml.bind.Binder类从从XML文件读取的文档对象中解组对象,并使用活页夹updateXML方法将对象编入文档对象,然后再将其写入XML。文件。
这样做的原因是注释保留在文档对象中,而不是JAXB对象中。您还应该查看updateJAXB方法(如果决定更新文档对象)。 如果您发布的代码无效,我们会更好地帮助您。