注意:  我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
JAXB 中的Binder机制可能正是您正在寻找的。它不允许将 DOM 节点强制转换为域对象,但它确实维护了域对象与其对应的 DOM 节点之间的链接。
注意:  以下代码在使用 MOXy 作为 JAXB 提供程序时运行良好,但在使用我碰巧正在运行的 JDK 版本中包含的 JAXB 的 impl 时抛出异常。
JAVA模型
我将在此示例中使用以下域模型。
顾客
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Customer {
    private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
    @XmlElementWrapper
    @XmlElement(name="phoneNumber")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }
}
电话号码
import javax.xml.bind.annotation.*;
public class PhoneNumber {
    private String type;
    private String number;
    @XmlAttribute
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @XmlValue
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
}
jaxb.properties
要将 MOXy 指定为您的 JAXB 提供程序,您需要包含一个jaxb.properties在与域模型相同的包中调用的文件,其中包含以下条目(请参阅:http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -你的.html )
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
XML (输入.xml)
<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <phoneNumbers>
        <phoneNumber type="work">555-1111</phoneNumber>
        <phoneNumber type="home">555-2222</phoneNumber>
    </phoneNumbers>
</customer>
演示代码
在下面的演示代码中,我将执行以下操作:
- 使用 XPath 查找子元素,然后使用
Binder查找相应的域对象。 
- 更新域对象并使用 将
Binder更改应用到 DOM。 
- 更新 DOM 并使用 将
Binder更改应用于域对象。 
演示
import javax.xml.bind.Binder;
import javax.xml.bind.JAXBContext;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
public class Demo {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse("src/forum16599580/input.xml");
        XPathFactory xpf = XPathFactory.newInstance();
        XPath xpath = xpf.newXPath();
        JAXBContext jc = JAXBContext.newInstance(Customer.class);
        Binder<Node> binder = jc.createBinder();
        binder.unmarshal(document);
        // Use Node to Get Object
        Node phoneNumberElement = (Node) xpath.evaluate("/customer/phoneNumbers/phoneNumber[2]", document, XPathConstants.NODE);
        PhoneNumber phoneNumber = (PhoneNumber) binder.getJAXBNode(phoneNumberElement);
        // Modify Object to Update DOM
        phoneNumber.setNumber("555-2OBJ");
        binder.updateXML(phoneNumber);
        System.out.println(xpath.evaluate("/customer/phoneNumbers/phoneNumber[2]", document, XPathConstants.STRING));
        // Modify DOM to Update Object
        phoneNumberElement.setTextContent("555-2DOM");
        binder.updateJAXB(phoneNumberElement);
        System.out.println(phoneNumber.getNumber());
    }
}
输出
555-2OBJ
555-2DOM