Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JAXB保留XML注释?_Java_Jaxb_Marshalling_Unmarshalling - Fatal编程技术网

Java 如何使用JAXB保留XML注释?

Java 如何使用JAXB保留XML注释?,java,jaxb,marshalling,unmarshalling,Java,Jaxb,Marshalling,Unmarshalling,如何在不丢失注释的情况下解组和封送XML文件? 使用JAXB是否有任何方法,我尝试使用以下示例 但这对我来说是行不通的 <customer> <address> <!-- comments line 1 --> <street>1 Billing Street</street> </address> <address>

如何在不丢失注释的情况下解组和封送XML文件? 使用JAXB是否有任何方法,我尝试使用以下示例 但这对我来说是行不通的

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

比尔街1号
航运路2号
我想解封上面的xml,向它添加一个新地址,并在不丢失以下注释的情况下重新整理它

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

您可以将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();
        }
    }

}

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



通过这种方式,语义在模型中不会在注释中“隐藏”。

@Hareesh为了使用您提供的示例在XML文件中保留注释,您需要使用DOM(文档对象模型)来读写XML文件,而不是JAXB(如示例所示)。但是,您可以使用javax.xml.bind.Binder类从从xml文件中读取的文档对象中解组对象,并在将对象写入xml文件之前,使用Binder updateXML方法将对象重新打包到文档对象中。
<!--   comments line 1 -->
   <!-- comments line 2-->
这样做的原因是注释是在文档对象中维护的,而不是在JAXB对象中维护的。您还应该查看updateJAXB方法(如果您决定更新文档对象)。
如果您发布了不起作用的代码,我们可以提供更好的帮助。

到底是什么问题?我正在丢失xml中的注释。@Hareesh您可以添加问题的更多细节或示例吗?。。问题还不够清楚。使用JAXB无法检索注释。@Xstian我添加了示例。由于您添加了导入,我倾向于假设所有类都在这两个(+java.lang)包中。class
Xml
在哪里?Xml是您的客户,我称之为“Xml”以简化示例我对Xml中的注释不感兴趣。我只是想,不是要删除那些注释,它应该出现在解包之前的同一位置。我认为使用xsr,它将解决一个xml而不是多个xml(遵循不同的XSD)的问题。使用XMLStreamReader,您可以解析所需的每个xml:)注释不表示与客户相关的任何值。它指定添加此客户的原因。只是为了容易理解。