0

假设我有这个类,我想使用 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>`

现在我想用更多元素包装类的每个属性:例如,指示属性的类型。

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

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

4

1 回答 1

0

我不相信您可以使用 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);

这就是通用过滤器实现的样子(请注意,这只是充当身份过滤器;我将实现您的自定义映射规则作为练习:)

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);
  }
}

为了让您了解过滤器的功能,请参见例如。https://www.ibm.com/developerworks/community/forum/html/topic?id=60ef4f89-701a-447a-9375-3880115eb65ahttp://blog.bdoughan.com/2012/11/applying-namespace-在-jaxb-unmarshal.html 期间

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

于 2018-06-05T12:00:19.787 回答