Java JAXB可映射XML元素

Java JAXB可映射XML元素,java,xml,jaxb,marshalling,xmladapter,Java,Xml,Jaxb,Marshalling,Xmladapter,在my xi模式的root.class中,元素项和ohter对象是itemList的一部分: @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) //... protected List<Object> itemList; 因此,numItemType对于JAXBElement有一些属性和值(num) NumItemType.class: @XmlJ

在my xi模式的root.class中,元素项和ohter对象是itemList的一部分:

@XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) 
//...
protected List<Object> itemList;
因此,numItemType对于
JAXBElement
有一些属性和值(num)

NumItemType.class:

@XmlJavaTypeAdapter(numItemTypeAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "numItemType", namespace = "xi", propOrder = {
    "num"
})

public class NumItemType {

    @XmlValue
    protected BigDecimal num;
    @XmlAttribute(name = "precision")
    protected String precision;
    @XmlAttribute(name = "decimals")
    protected String decimals;
    //... more Attributes

}
public class AdaptedNum {
    @XmlElement 
    private  double element1;
    @XmlElement
    private String element2;
    @XmlElement
    private String element3;

   /** Some getter/setter methods */
}
但是当
JAXB
解组
XML
文档时,它将只包含元素,例如:

<detailedInformation>
    <element1>1234</element1>
    <element2>5678</element2>
    <element3>bla</element3>
</detailedInformation>

我想,这会对我有所帮助,但这一切都有点棘手:-/

要准确地找出问题可能发生的地方有点棘手。我假设您的原始模型是从XML模式生成的,这应该可以正常工作,而无需任何修改。我试图在下面提供一个缩小版的示例,这可能会有所帮助

根目录

package forum11343610;

import java.util.*;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) 
    protected List<Object> itemList = new ArrayList<Object>();

    public List<Object> getItemList() {
        return itemList;
    }

    public void setItemList(List<Object> itemList) {
        this.itemList = itemList;
    }

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
<detailedInformation>
     <element1>1234</element1>
     <element2>5678</element2>
     <element3>bla</element3>
</detailedInformation>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
ObjectFactory

package forum11343610;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    private static final QName _detailedInformation_QNAME = new QName("de-schema", "detailedInformation");

    @XmlElementDecl(namespace = "xi", name = "item")
    public JAXBElement<NumItemType> createItem(NumItemType num) {
        return new JAXBElement<NumItemType>(_detailedInformation_QNAME, NumItemType.class, null, num);
    }

    @XmlElementDecl(namespace = "de-schema", name = "detailedInformation", substitutionHeadNamespace = "xi", substitutionHeadName = "item")
    public JAXBElement<NumItemType> createDetailedInformation(NumItemType num) {
        return new JAXBElement<NumItemType>(_detailedInformation_QNAME, NumItemType.class, null, num);
    }

}
输出

package forum11343610;

import java.util.*;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) 
    protected List<Object> itemList = new ArrayList<Object>();

    public List<Object> getItemList() {
        return itemList;
    }

    public void setItemList(List<Object> itemList) {
        this.itemList = itemList;
    }

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
<detailedInformation>
     <element1>1234</element1>
     <element2>5678</element2>
     <element3>bla</element3>
</detailedInformation>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>

10

感谢您的评论

这就是重点:

演示

package forum11343610;

import java.math.BigDecimal;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class, ObjectFactory.class);

        ObjectFactory objectFactory = new ObjectFactory();
        Root root = new Root();

        NumItemType numItemType = new NumItemType();
        numItemType.num = BigDecimal.TEN;
        numItemType.decimals = "1";
        numItemType.precision = "2";
        root.getItemList().add(objectFactory.createDetailedInformation(numItemType));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}
NumItemType numItemType = new NumItemType();
numItemType.num = BigDecimal.TEN;
numItemType.decimals = "1";
numItemType.precision = "2";
root.getItemList().add(objectFactory.createDetailedInformation(numItemType));
JAXBContext jc = JAXBContext.newInstance(Root.class, ObjectFactory.class);
Unmarshaller u = jc.createUnmarshaller();
File xml = new File("D:/", "test.xml");
Root root = (Root) u.unmarshal(xml);
它应该自动解组和映射XML

XML输入

package forum11343610;

import java.util.*;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) 
    protected List<Object> itemList = new ArrayList<Object>();

    public List<Object> getItemList() {
        return itemList;
    }

    public void setItemList(List<Object> itemList) {
        this.itemList = itemList;
    }

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
<detailedInformation>
     <element1>1234</element1>
     <element2>5678</element2>
     <element3>bla</element3>
</detailedInformation>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
输出

package forum11343610;

import java.util.*;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false) 
    protected List<Object> itemList = new ArrayList<Object>();

    public List<Object> getItemList() {
        return itemList;
    }

    public void setItemList(List<Object> itemList) {
        this.itemList = itemList;
    }

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>
<detailedInformation>
     <element1>1234</element1>
     <element2>5678</element2>
     <element3>bla</element3>
</detailedInformation>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:ns2="de-schema" xmlns:ns3="xi">
    <ns2:detailedInformation precision="2" decimals="1">10</ns2:detailedInformation>
</root>

10
我可以使用DOM将XML文档解析为树,并使用JAXB进行marhalling

谢谢大家!

换句话说:

我想在不更改模式java代码的情况下,为解组设置新元素到NumItemType.class

NumItemType.class

package forum11343610;

import java.math.BigDecimal;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "numItemType", namespace = "xi", propOrder = {
    "num"
})

    @XmlJavaTypeAdapter(NumItemTypeAdapter.class)
    public class NumItemType {

        @XmlValue
        protected BigDecimal num;
        @XmlAttribute(name = "precision")
        protected String precision;
        @XmlAttribute(name = "decimals")
        protected String decimals;
        //... more Attributes

    }
public  class NumItemTypeAdapter extends XmlAdapter<AdaptedNum, NumItemType> {

    @Override
    public NumItemType unmarshal(AdaptedNum an) throws Exception {
        NumItemType nit = new NumItemType();
        nit.setNum(an.getNum);
        nit.setPrecision(an.getPrecision);
        nit.setDecimals(an.getDecimals)
        return nit;
    }

}
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "adaptedNum", namespace = "", propOrder = {
        "element1",
        "element2",
        "element3"
    })

    public class AdaptedNum {

        @XmlElement(name ="element1")
        protected  BigDecimal num;
        @XmlElement(name ="element2")
            private String decimals;
        @XmlElement(name ="element3")
            private String precison;
            // set/get method
}
NumItemTypeAdapter.class

package forum11343610;

import java.math.BigDecimal;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "numItemType", namespace = "xi", propOrder = {
    "num"
})

    @XmlJavaTypeAdapter(NumItemTypeAdapter.class)
    public class NumItemType {

        @XmlValue
        protected BigDecimal num;
        @XmlAttribute(name = "precision")
        protected String precision;
        @XmlAttribute(name = "decimals")
        protected String decimals;
        //... more Attributes

    }
public  class NumItemTypeAdapter extends XmlAdapter<AdaptedNum, NumItemType> {

    @Override
    public NumItemType unmarshal(AdaptedNum an) throws Exception {
        NumItemType nit = new NumItemType();
        nit.setNum(an.getNum);
        nit.setPrecision(an.getPrecision);
        nit.setDecimals(an.getDecimals)
        return nit;
    }

}
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "adaptedNum", namespace = "", propOrder = {
        "element1",
        "element2",
        "element3"
    })

    public class AdaptedNum {

        @XmlElement(name ="element1")
        protected  BigDecimal num;
        @XmlElement(name ="element2")
            private String decimals;
        @XmlElement(name ="element3")
            private String precison;
            // set/get method
}