java - 可以使用 JAXB(或 JAXB + StAX)编码 XML 的一部分吗?

标签 java xml parsing jaxb stax

我有一个非常庞大的 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/

相关文章:

java - java中的同步请求响应

java - 当 url 有参数时,JSF 不会呈现

.net - 传递 xml 并获取强类型 .NET 对象

xml - 简单的 XML 解码返回空值

ios - JSON iOS 解析字符串

iphone - SBJSON 解析器内存泄漏

javascript - JavaCC中如何实现JavaScript自动插入分号?

java - Maven命令下载最新版本的jar

html - 创建 XSD 以忽略标签内的 HTML

java - 如何在 Antlr-4 词法分析器规则的操作中获取 token 属性