Java JAXB是否支持在不进行编组/解编组的情况下修改现有XML文档?

Java JAXB是否支持在不进行编组/解编组的情况下修改现有XML文档?,java,xml,jaxb,Java,Xml,Jaxb,我希望在文档中保留注释、排序等,并使用Java接口就地编辑文档 JAXB能做到这一点吗 其他工具(如XMLBeans)是否可以做到这一点?您可以将JAXB用于此用例: input.xml <?xml version="1.0" encoding="UTF-8"?> <customer> <UNMAPPED_ELEMENT_1/> <name>Jane Doe</name> <!-- COMMENT #1 -

我希望在文档中保留注释、排序等,并使用Java接口就地编辑文档

JAXB能做到这一点吗

其他工具(如XMLBeans)是否可以做到这一点?

您可以将JAXB用于此用例:

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <UNMAPPED_ELEMENT_1/>
    <name>Jane Doe</name>
    <!-- COMMENT #1 -->
    <address>
        <UNMAPPED_ELEMENT_2/>
        <street>1 A Street</street>
        <!-- COMMENT #2 -->
        <UNMAPPED_ELEMENT_3/>
        <city>Any Town</city>
    </address>
    <!-- COMMENT #3 -->
    <UNMAPPED_ELEMENT_4/>
    <phone-number type="home">555-HOME</phone-number>
    <!-- COMMENT #4 -->
    <phone-number type="cell">555-CELL</phone-number>
    <UNMAPPED_ELEMENT_5/>
    <!-- COMMENT #5 -->
</customer>

无名氏


奇怪的是,新的活页夹代码对我不起作用,尽管它几乎与我以前使用的解组代码完全相同。这是一个很好用的老代码:
File-xmlFile=。。。文件xmlSchema=。。。JAXBContext JAXBContext=JAXBContext.newInstance(Process.class);Unmarshaller Unmarshaller=jaxbContext.createUnmarshaller();unmarshaller.setSchema(SchemaFactory.newInstance(xmlstants.W3C_XML_SCHEMA_NS_URI).newSchema(xmlSchema);Process Process=(Process)unmarshaller.unmarshal(xmlFile);
这是新代码:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();DocumentBuilder db=dbf.newDocumentBuilder();Document Document=db.parse(xmlFile);JAXBContext JAXBContext=JAXBContext.newInstance(Process.class);Binder Binder=JAXBContext.createBinder();Binder.setSchema(SchemaFactory.newInstance)(xmlstants.W3C_XML_SCHEMA_NS_URI)。newSchema(xmlSchema);Process Process=(Process)Binder.unmarshal(文档);
新代码抛出:
javax.xml.bind.UnmarshalException-带有链接异常:[org.xml.sax.SAXParseException:cvc elt.1:找不到元素“process”的声明。]
但在我看来,它们看起来几乎完全一样。有什么想法吗?有人吗?完成了。谢谢你的帮助。更重要的是,感谢MOXy。JDK impl.没有保留这些评论。对于稍后阅读本文的其他人,我确实在java.net metro和jaxb论坛上问了这个问题,但没有任何回应(这是几天后的事).这个论坛看起来像个鬼城。
import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

public class BinderDemo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        File xml = new File("input.xml");
        Document document = db.parse(xml);

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Binder<Node> binder = jc.createBinder();
        Customer customer = (Customer) binder.unmarshal(document);
        customer.getAddress().setStreet("2 NEW STREET");
        PhoneNumber workPhone = new PhoneNumber();
        workPhone.setType("work");
        workPhone.setValue("555-WORK");
        customer.getPhoneNumbers().add(workPhone);
        binder.updateXML(customer);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(document), new StreamResult(System.out));
    }     
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<customer>
    <UNMAPPED_ELEMENT_1/>
    <name>Jane Doe</name>
    <!-- COMMENT #1 -->
    <address>
        <UNMAPPED_ELEMENT_2/>
        <street>2 NEW STREET</street>
        <!-- COMMENT #2 -->
        <UNMAPPED_ELEMENT_3/>
        <city>Any Town</city>
    </address>
    <!-- COMMENT #3 -->
    <UNMAPPED_ELEMENT_4/>
    <phone-number type="home">555-HOME</phone-number>
    <!-- COMMENT #4 -->
    <phone-number type="cell">555-CELL</phone-number>
    <phone-number type="work">555-WORK</phone-number>
    <UNMAPPED_ELEMENT_5/>
    <!-- COMMENT #5 -->
</customer>