met*_*al7 5 java xml parsing stax jaxb
我有一个非常庞大的XML结构.我想通过解组一个元素然后应用业务逻辑来更新此XML的各个部分.
我能够将子元素解组成POJO.我想在Java中对这个POJO进行更改,然后在同一位置将其更新回XML.
这在JAXB中可行吗?或者使用JAXB + StAX的组合.
示例结构:
<folder id="c5718b36-bab1-4c08-8f75-8e2f9aee42c5" name="Folder-1">
<description> folder Desc</description>
<createdBy>User2</createdBy>
<hidden>false</hidden>
<file id="4f2efb42-0604-4878-9e1e-ae90d66fb836" name="File-1">
<description>file desc</description>
<createdBy>User1</createdBy>
<hidden>false</hidden>
</file>
</folder>
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我能够将'file'元素解组为POJO.我想对此POJO进行更改,然后在XML文件中的正确位置更新它.
我怎么能做到这一点?
请帮我.谢谢.
您可以使用JAXB和StAX执行以下操作:
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.events.XMLEvent;
import java.io.*;
public class Demo {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLOutputFactory xof = XMLOutputFactory.newFactory();
try(
FileInputStream in = new FileInputStream("in.xml");
FileOutputStream out = new FileOutputStream("out.xml");
) {
XMLEventReader xer = xif.createXMLEventReader(in);
XMLEventWriter xew = xof.createXMLEventWriter(out);
JAXBContext jc = JAXBContext.newInstance(File.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
while(xer.hasNext()) {
if(xer.peek().isStartElement() && xer.peek().asStartElement().getName().getLocalPart().equals("file")) {
// Unmarshal the File object from the XMLEventReader
File file = (File) unmarshaller.unmarshal(xer);
// Modify the File object
file.description = "NEW DESCRIPTION";
// Marshal the File object to the XMLEventWriter
marshaller.marshal(file, xew);
} else {
// Copy node from reader to writer
xew.add(xer.nextEvent());
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想要 StAX,请参阅方法:
javax.xml.bind.Unmarshaller.unmarshal(XMLStreamReader, Class<T>)javax.xml.bind.Marshaller.marshal(Object, XMLStreamWriter)您可以从流中解组已知的类,对其进行处理并重新编组。这甚至可以在类似“过滤器”的过程中完成。IE: