当前位置: 首页 > 面试题库 >

如何使用JAXB为XML中的空元素生成结束标记

胡彭亮
2023-03-14
问题内容

我正在使用JAXB生成XML。但是JAXB会生成一个空的Tag来自我关闭。但是我的客户想要单独的空标签。我知道两者都是平等的,但他不同意我的看法。请任何人提出解决方案。谢谢。

样例代码:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "currencyCode",
    "discountValue",
    "setPrice",
    "spendLowerThreshold",
    "spendUpperThreshold",
    "discountApportionmentPercent",
    "discountApportionmentValue"
})
@XmlRootElement(name = "countryData")
public class CountryData {
    protected String currencyCode;
    protected String discountValue = "";
    protected String setPrice = "";
    protected String spendLowerThreshold = "";
    protected String spendUpperThreshold = "";
    protected String discountApportionmentPercent = "";
    protected String discountApportionmentValue = "";

    // Setters and Gettres
}

实际输出:

<currencyCode>GBP</currencyCode>
<discountValue/>
<setPrice/>
<spendLowerThreshold/>
<spendUpperThreshold/>
<discountApportionmentPercent>0.0</discountApportionmentPercent>
<discountApportionmentValue/>

预期产量:

<currencyCode>GBP</currencyCode>
<discountValue></discountValue>
<setPrice></setPrice>
<spendLowerThreshold></spendLowerThreshold>
<spendUpperThreshold></spendUpperThreshold>
<discountApportionmentPercent>0.0</discountApportionmentPercent>
<discountApportionmentValue></discountApportionmentValue>

编组代码:

try {
    Marshaller marshaller = JAXBContext.newInstance(CountryData.class).createMarshaller();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    marshaller.marshal(countryData , os);
    log.debug("The PPV request raw XML -> " + os.toString());
} catch (JAXBException e) {
    // nothing to do
}

我正在使用JDK 6.0


问题答案:

如果您已经从XSD生成了类,那么您还将生成ObjectFactory类。如果没有,请参考这里有关如何生成ObjectFactory类的信息。

在那之后,您的代码将像-

JAXBContext context;
            context = JAXBContext.newInstance(*yourClass*.class);

final ObjectFactory objFactory = new ObjectFactory();

            final JAXBElement<YourClass> element = objFactory
                    .*autoGeneratedmethodfromObjectFactorytogetelement*;

Marshaller marshaller;
            marshaller = context.createMarshaller();

            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            final StringWriter stringWriter = new StringWriter();


            marshaller.marshal(element, stringWriter);
          String message = stringWriter.toString();

这将为您提供所需的输出。



 类似资料:
  • 问题内容: 我需要在jaxb中将空值显示为空元素。我正在使用jaxb的moxy实现。我找到了这个选项 是否可以在类级别应用任何类似的扩展(对于其中定义的所有元素) 问题答案: 我强烈建议使用不存在节点或使用属性来表示。这与模式验证(即或不是有效的type元素)一起使用时效果最佳。但是,如果不能这样做,那么可以完成用例: 标准JAXB行为 使用标准的API,你可以控制NULL是表示为不存在的节点或与

  • 我正在使用JAXB生成用于编组/解组XML的类。问题是父类的命名空间仅适用于XML中的父元素,而不适用于JAXB注释类中使用的子类。 我不知道我犯了什么错误。下面是我的xsd和xml以及类。 XSD: 项目Responses.xsd JAXB类 项目响应.java 项目响应.java Money.java XML输出: 包信息。java有以下条目 货币类别不在同一个包中。如何将其包含在 Jaxb

  • 我有这种结构的xml文件: 有没有可能将这种XML解组到一个对象中。问题是每个元素都有一些独特的标签。我想把这些值放到列表中,但是我不知道怎么做。

  • 如何使用JAXB生成以下结构?在我的例子中,我有一个动态属性列表,它可能有3种类型:整数、字符串或列表。但是,列表属性具有嵌套元素。我怎样才能做到这一点?

  • myType也被定义为complexType。然后得到生成的类MyResponse.java和Reference.java。我可以通过以下方式分配“引用”的值: 而且奏效了。 现在我只是删除了maxOccurs=“unbounded”,它不再起作用了。响应不再是List类型,而是JaxBelement类型。我试着用: 谁能告诉我,当它不是一个列表时,什么是正确的做法?