Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在没有父标记的情况下封送对象?_Java_Jaxb - Fatal编程技术网

Java 是否可以在没有父标记的情况下封送对象?

Java 是否可以在没有父标记的情况下封送对象?,java,jaxb,Java,Jaxb,我有下面的课。编组时,我想省略标记“config”,是否可能 @XmlRootElement(name = "config") @XmlAccessorType(XmlAccessType.FIELD) public static class Config { @XmlElement(name = "dry-run") protected Boolean dryRun; @XmlElementWrapper(name = "filters")

我有下面的课。编组时,我想省略标记“config”,是否可能

@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public static class Config {

        @XmlElement(name = "dry-run")
        protected Boolean dryRun;

        @XmlElementWrapper(name = "filters")
        @XmlElement(name = "filter")
        protected List<String> filters;

        public Boolean isDryRun() {
                return dryRun;
        }

        public void setDryRun(boolean dryRun) {
                this.dryRun = dryRun;
        }

        public List<String> getFilters() {
                return filters;
        }
}
@XmlRootElement(name=“config”)
@XmlAccessorType(XmlAccessType.FIELD)
公共静态类配置{
@XmlElement(name=“干运行”)
保护布尔干运行;
@xmlementwrapper(name=“filters”)
@XmlElement(name=“filter”)
受保护列表过滤器;
公共布尔值isDryRun(){
返回干运行;
}
公共void setDryRun(布尔dryRun){
this.dryRun=dryRun;
}
公共列表getFilters(){
回流过滤器;
}
}
示例:

电流输出:


假的
我的过滤器
期望输出:


假的
我的过滤器
更新:


我只想知道“是否只能用JAXB完成?”。检查一下,我不明白他是如何只使用JAXB而没有编写根元素的。这正是我想要的。

因此,您不希望将对象封送到单个XML子树,而是封送到一个XML片段,即没有父对象的同级列表。我相信用Jaxb本身是无法实现这一点的。但您可以序列化为某种中间形式并处理它。例如,您可以创建自己的SAX
ContentHandler
,并使该处理程序计数深度,并且仅以非零嵌套深度委托事件

class NoRoot extends XMLFilterImpl {

  private int depth;

  @Override public void startDocument() throws SAXException
  {
    depth = 0;
  }

  @Override public void startElement(String uri, String localName,
                                     String qName, Attributes atts)
    throws SAXException
  {
    if (depth != 0) super.startElement(uri, localName, qName, atts);
    ++depth;
  }

  @Override public void endElement(String uri, String localName,
                                   String qName)
    throws SAXException
  {
    --depth;
    if (depth != 0) super.endElement(uri, localName, qName);
  }

}

您要编组到哪种类型的输出(
OutputStream
StreamWriter
节点
等)?在这个用例中,
Root
元素从何而来。可能会有帮助-@BlaiseDoughan在整理配置时,我得到一个xmlString。使用Sax将该字符串追加到根元素中。这是由于我无法修改的遗留代码造成的。@mtk感谢您的提示,但我不能将标题设置为null,因为在某些情况下需要标记“config”,在某些情况下(如我的答案中的标记),我知道我可以使用SAX,但我们正在从SAX迁移到JAXB,因此我们不想再次使用SAX..:(@AdelBoutros:如果您无法控制序列化
根元素的代码,也无法更改XMl模式,那么您就没有选择了。您可以使用DOM或STAX而不是SAX,但最终效果是一样的,而且您的代码中还会有一个API。JAXB希望XMl模式和Java objec之间能够非常匹配因此,除非其他人有我忽略的解决方案,否则您的设置与预期不符。请检查一下,我不明白他是如何只使用JAXB而没有编写根元素的。这正是我想要的。@AdelBoutros:您指出的链接是从2008年开始的。我猜JAXB在当时没有那么严格。因为链接只指定XSD,我猜他使用xjc从中生成java类。在这种情况下,他封送的类d应该使用
@XmlType
而不是
@XmlRootElement
进行注释。但是,当我尝试用最新版本的Java复制此注释时,我得到一个MarshalException:“无法封送类型”生成。CustomerType“作为元素,因为它缺少
@XmlRootElement
注释”.所以这可能在某个时候起作用,但今天似乎不再起作用了。
<Root>
    <dry-run>false</dry-run>
    <filters>
      <filter>
        myFilter
      </filter>
    </filters>
</Root>
class NoRoot extends XMLFilterImpl {

  private int depth;

  @Override public void startDocument() throws SAXException
  {
    depth = 0;
  }

  @Override public void startElement(String uri, String localName,
                                     String qName, Attributes atts)
    throws SAXException
  {
    if (depth != 0) super.startElement(uri, localName, qName, atts);
    ++depth;
  }

  @Override public void endElement(String uri, String localName,
                                   String qName)
    throws SAXException
  {
    --depth;
    if (depth != 0) super.endElement(uri, localName, qName);
  }

}