Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 多层XML元素_Java_Xml_Jaxb - Fatal编程技术网

Java 多层XML元素

Java 多层XML元素,java,xml,jaxb,Java,Xml,Jaxb,假设我有这个类,我想使用JAXB生成XML文件 public class Document{ private String id; private Date signatureDate; here goes Constructor, getters and setters } 当我生成XML文件时,我会得到如下结果 `<document> <id>id3</id> <signatureDate>197

假设我有这个类,我想使用JAXB生成XML文件

 public class Document{

    private String id;
    private Date signatureDate;

    here goes Constructor, getters and setters
}
当我生成XML文件时,我会得到如下结果

`<document>
    <id>id3</id>
    <signatureDate>1970-01-01T01:00:00+01:00</signatureDate>
</documento>`
`
id3
1970-01-01T01:00:00+01:00
`
现在我想用更多的元素来包装类的每个属性:例如,指示属性的类型

`<document>
    <id>
        <paperid>
            <string>id3<string>
        <paperid>
    <id>
    <signatureDate>
        <signatureYearDayAndHour>
             <date>1970-01-01T01:00:00+01:00</date>
        </signatureYearDayAndHour>
    </signatureDate>
</documento>`
`
id3
1970-01-01T01:00:00+01:00
`

最终的目标是用不同的xmlElement包装类的每个属性。

我不相信您可以使用JAXB应用像您这样的自定义元映射规则。JAXB定义了自己的具体XML/POJO映射规则,并且只支持Java类型、名称空间以及官方文档中针对
bindings.xjb
文件和
xjc
工具讨论的其他相对简单的定制

不过,您可以做的是设置XML解析管道,以便在XML事件进入JAXB解组之前应用过滤。以下是在JAXP中连接自定义过滤器的方式:

JAXBContext jc = JAXBContext.newInstance(Document.class);
XMLFilter filter = new MyFilter();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
filter.setParent(sp.getXMLReader());
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler =
  unmarshaller.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
filter.parse(inputsource);
这就是通用过滤器实现的样子(请注意,这只是充当标识过滤器;我将实现自定义映射规则作为练习:)

要让您了解过滤器可能的功能,请参见示例和


最后,请注意,要使用类型信息注释XML元素,使用
xsi:type
属性是既定的惯例,因此您可能希望接受它并更改您的设计,而不是发明您自己的映射规则。

到目前为止您尝试了什么?我尝试过XmlElementWrapper,但在我看来,这只适用于一组元素。发布您迄今为止尝试过的代码;显示输出。这将有助于其他人识别您的问题。
class MyFilter extends XMLFilterImpl {

  @Override
  public void startElement(String uri, String localName, String qName, Attributes atts)
  throws SAXException {
    super.startElement(uri, localName, qName, atts);
  }

  @Override
  public void endElement(String uri, String localName, String qName)
  throws SAXException {
    super.endElement(uri, localName,  qName);
  }
}