Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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(或JAXB+;StAX)对XML的一部分进行编组吗?_Java_Xml_Parsing_Jaxb_Stax - Fatal编程技术网

Java 可以使用JAXB(或JAXB+;StAX)对XML的一部分进行编组吗?

Java 可以使用JAXB(或JAXB+;StAX)对XML的一部分进行编组吗?,java,xml,parsing,jaxb,stax,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<

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

文件夹描述
用户2
假的
文件描述
用户1
假的
在上面的示例中,我能够将“file”元素解组到POJO中。我希望对此POJO进行更改,然后在XML文件中的正确位置对其进行更新

我怎样才能做到这一点

请帮帮我。 谢谢。

试试,看看

如果需要StAX,请参阅以下方法:

  • javax.xml.bind.Unmarshaller.unmarshal(XMLStreamReader,类)
  • javax.xml.bind.Marshaller.marshall(对象,XMLStreamWriter)
您可以从流中解组已知的klass,对其进行处理并封送回来。这甚至可以在一个类似“过滤器”的过程中完成。即:

  • 您可以通过StAX解析XML
  • 检查即将发生的事件,直到看到要处理的内容
  • 不相关的事件被进一步传递
  • 当您得到一个相关事件时,您可以使用JAXB解组类,处理pojo并将其封送回流编写器

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

}

谢谢你的信息。Binder是一个很好的解决方案,但我不想在代码中使用DOM。相反,我可以利用Blaise Doughan在本页中的回答。你忘了添加收集新活动吗?比如reader.nextEvent();我认为这样的代码应该为第一个XML元素启动无限循环