你是对的,Castor 需要一个静态映射。但是你可以使用它。您可以编写一些代码来修改传入的 xml,以便在您这边,Castor 可以使用一个模式,而在您的客户端方面,他们不必更改他们的模式。
更改 Castor 期望得到的具有共同根元素的模式,在此之下,您可以为不同的对象提供九种不同的替代方案(我认为您可以限制它,因此该模式将只允许九种中的一种,如果没有的话) t 工作你可以只使所有子元素可选)。
然后,您可以编写代码来修改传入的 xml 以使用该公共根元素包装传入的 xml,然后将包装的 xml 提供给 Castor unmarshaller 读取的流。
至少有 3 种不同的方式来实现 xml 包装部分:SAX、XSLT 和 XML 库(如 JDOM、DOM4J 和 XOM——我更喜欢 XOM,但它们中的任何一个都可以)。
如果您已经熟悉 SAX,或者如果其他方法之一有效但性能不足,则 SAX 方法可能是最好的。如果我必须实现它,那么我将创建一个接收 xml 并将 xml 写出的 XMLFilter,将其堆叠在另一个将 xml 写入 OutputStream 的部分之上,并围绕解组的内容编写一个包装器方法以将传入的流提供给xmlreader,将 OutputStream 复制到另一个 InputStream(一种简单的方法是使用 commons-io),并将新的 InputStream 提供给 Castor unmarshaller。
有了 XSLT,就不会和 SAX 开玩笑了,虽然 XSLT 有时以痛苦着称,但在我看来,这可能是一个相对简单的转换,但我也没有尝试过。很久没有使用 XSLT 做任何事情了。我也不确定性能,尽管我不会一概而论。
使用 XOM 或 JDOM 或 DOM4J 来包装 XML 也是可能的,并且学习曲线比 SAX 或 XSLT 低很多。缺点是整个 XML 文档往往会立即被吸入内存,因此如果您处理足够大的文档,您可能会耗尽内存。