java - 如果 JAXB Marshals 根元素只有一个属性,则没有关闭标记

标签 java xml jaxb moxy

我正在使用 JAXB/Moxy 将类编码为 XML。当根元素只包含一个属性时,输出如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <procedure xmlns="http://xml.test.com/api/request" name="TestProcedure"/>

所需的输出包含过程的结束标记:

   <?xml version="1.0" encoding="UTF-8"?>
   <procedure xmlns="http://xml.test.com/api/request" name="TestProcedure"></procedure>

这是被发送到第三方系统。即使两者都是格式正确的 XML,它仍然需要结束标记。

我看到这篇文章:JAXB marshals XML differently to OutputStream vs. StringWriter 但在本地运行时没有看到输出流和字符串之间的输出差异。

这似乎只处理元素和属性,而不处理根元素: Represent null value as empty element in xml jaxb 我仍然设置了一个 DescriptorCustomizer 并查看了调试器中的 ClassDescriptor,但没有看到任何要设置的属性,如 XMLDirectMapping。

我的领域对象看起来像

   @XmlRootElement(name = "procedure")
   public class ProcRequest {
    protected String procName;
    protected String requestId;
    protected List<Param> parameter;

    @XmlAttribute
    public String getProcName() {
        return procName;
    }
    public void setProcName(String procName) {
        this.procName = procName;
    }
    @XmlAttribute
    public String getRequestId() {
        return requestId;
    }
    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }
    @XmlElement
    public List<Param> getParam() {
        if (this.param == null) {
            this.param = new ArrayList<Param>();
        } 

        return param;
    }
    public void setParam(List<Param> param) {
        this.param = param;
    }

   }

我的服务包含:

   ProcRequest procRequest = new ProcRequest();
   procRequest.setProcName("TestProcedure");

   JAXBContext jaxbContext = JAXBContext.newInstance(ProcRequest.class);

   Marshaller moxyMarshaller = jaxbContext.createMarshaller();
   moxyMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

   moxyMarshaller.marshal(procRequest, System.out);

是否有任何属性或属性可以设置为在末尾强制使用结束标记,类似于 Marshaller.JAXB_FORMATTED_OUTPUT? 或者还有其他建议吗?

最佳答案

因为这两种形式在语义上是等价的 XML:

  1. 标准 JAXB 编码(marshal)拆收器不提供控制此细节的选项;和
  2. 任何解决方案都必须在 XML 处理之外。

除非您可以使用允许自定义空标记的不同 JAXB 或编码(marshal)拆收器实现,否则我相信您会被卡住。我认为 Saxon 曾经有过这样的选择,但多年来一直没有考虑。

关于java - 如果 JAXB Marshals 根元素只有一个属性,则没有关闭标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536008/

相关文章:

java - 使用 SAX 进行 XML 解析 : how to handle html as text within xml-tags

java - 从不同项目导入xsd,生成java类

java - JAXB 和 REST - XSD 的值(value)?

java - JNDI 是否仅与 webcontiner/J2EE 应用程序一起使用

java - 升级到 JRE 1.7.0_13 后小程序类名称错误

java - 如何指定变量作为参数?

xml - Android L 无法绘制虚线作为可绘制背景

java - 使用有状态 EJB 部署项目期间的 Glassfish 异常

java - Web服务(Web方法)字符串返回类型

java - 如何将Java集合转换为JAXB中XMLElement的属性?