我期待JAXB生成的XML具有以下模式:
<payload>
<parameters>
<paramName>clientAssocIds</paramName>
<paramVal>0207</paramVal>
<paramName>quoteType</paramName>
<paramVal>NTB</paramVal>
<paramName>quoteDateLimitDays</paramName>
<paramVal>365</paramVal>
<paramName>externalIndicator</paramName>
<paramVal>1</paramVal>
</parameters>
</payload>
<paramName>
和<paramVal>
是名称和值对,这意味着<paramVal>
必须遵循<paramName>
。
我写了一个XML Schema并使用JAXB基于这个模式生成java类,然后我设置了所有的值并编组了类,它没有生成我上面预期的xml模式。
这是我的架构:
<xsd:complexType name="sgrpCommonMessage">
<xsd:sequence>
<xsd:element name="payload" type="payload" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="payload">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="1">
<xsd:element name="parameters" type="parameter" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="parameter">
<xsd:sequence>
<xsd:element minOccurs="0" name="paramName" type="xsd:string" />
<xsd:element minOccurs="0" name="paramVal" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
生成的xml有一些<parameters>
,这不是我所期望的。我想将所有<paramName>
和<paramVal>
对包装在一个<parameters>
中:
<payload>
<parameters>
<paramName>quoteDateLimitDays</paramName>
<paramVal>NTB</paramVal>
</parameters>
<parameters>
<paramName>clientAssocIds</paramName>
<paramVal>0207</paramVal>
</parameters>
<parameters>
<paramName>quoteType</paramName>
<paramVal>NTB</paramVal>
</parameters>
<parameters>
<paramName>externalIndicator</paramName>
<paramVal>NTB</paramVal>
</parameters>
</payload>
我想知道JAXB是否能够实现这样的XML结构,如果没有,我应该使用什么API,如果是,怎么做?
答案 0 :(得分:0)
您可以拥有如下所示的XML架构:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="parameters" type="parameters" />
<xsd:complexType name="parameters">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="paramName" type="xsd:string" />
<xsd:element name="paramValue" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
然后使用生成的模型,您可以:
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance("forum14571803");
ObjectFactory objectFactory = new ObjectFactory();
Parameters parameters = objectFactory.createParameters();
parameters.getParamNameAndParamValue().add(objectFactory.createParametersParamName("A"));
parameters.getParamNameAndParamValue().add(objectFactory.createParametersParamValue("a"));
parameters.getParamNameAndParamValue().add(objectFactory.createParametersParamName("B"));
parameters.getParamNameAndParamValue().add(objectFactory.createParametersParamValue("b"));
JAXBElement<Parameters> root = objectFactory.createParameters(parameters);
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"?>
<parameters>
<paramName>A</paramName>
<paramValue>a</paramValue>
<paramName>B</paramName>
<paramValue>b</paramValue>
</parameters>