我有一个非常庞大的 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>
在上面的示例中,我能够将"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());
}
}
}
}
}
关于java - 可以使用 JAXB(或 JAXB + StAX)编码 XML 的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643097/