在我的xi-schema的root.class中,元素项和ohter对象是itemList的一部分:
@XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false)
//...
protected List<Object> itemList;
我在主模式的ObjectFactory.class
中有一些像JAXBElements这样的项目:
@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);
}
因此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
}
但是当JAXB
解组XML
文档时,它只包含元素,例如:
<detailedInformation>
<element1>1234</element1>
<element2>5678</element2>
<element3>bla</element3>
</detailedInformation>
当我编组它时,它应该变成(就像JAXB java代码):
<detailedInformation element2="5678" element3="bla">1234</detailedInformation>
因此,我编写了一个numItemTypeAdapter.class NumItemTypeAdapter扩展了XmlAdapter
AdaptedNum.class:
public class AdaptedNum {
@XmlElement
private double element1;
@XmlElement
private String element2;
@XmlElement
private String element3;
/** Some getter/setter methods */
}
我想,这对我有帮助http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html,但这有点棘手: - /
答案 0 :(得分:0)
准确地解决您的问题可能发生的位置有点棘手。我假设您的原始模型是从XML Schema生成的,这应该可以正常工作而无需任何修改。我在下面尝试提供示例的缩小版本,这可能会有所帮助。
<强>根强>
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;
}
}
<强> NumItemType 强>
package forum11343610;
import java.math.BigDecimal;
import javax.xml.bind.annotation.*;
@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
}
<强>的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.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);
}
}
<强>输出强>
<?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>
答案 1 :(得分:0)
感谢您的评论。
这就是重点:
<强>演示强>
NumItemType numItemType = new NumItemType();
numItemType.num = BigDecimal.TEN;
numItemType.decimals = "1";
numItemType.precision = "2";
root.getItemList().add(objectFactory.createDetailedInformation(numItemType));
它应该解组并自动映射XML。
XML输入
<detailedInformation>
<element1>1234</element1>
<element2>5678</element2>
<element3>bla</element3>
</detailedInformation>
使用代码:
<强>演示强>
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 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>
我可以使用DOM将XML文档解析为树并使用JAXB进行编组...
谢谢!
答案 2 :(得分:0)
换句话说:
我想为NumItemType.class设置新元素以进行解组而不更改架构java代码。
<强> 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
}
<强> NumItemTypeAdapter.class 强>
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;
}
}
<强> AdaptedNum.class 强>
@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
}