Java 如何使用JAXB保留XML注释?
如何在不丢失注释的情况下解组和封送XML文件? 使用JAXB是否有任何方法,我尝试使用以下示例 但这对我来说是行不通的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>
<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:)注释不表示与客户相关的任何值。它指定添加此客户的原因。只是为了容易理解。