我有一个java jaxb注释类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()
public class xmlDoc<T> {
@XmlMixed
@XmlAnyElement(lax=false)
protected T content;
public T getContent() {
return this.content;
}
public void setContent(T t) {
this.content = t;
}
}
当我使用jaxb生成xml架构时,我得到以下输出
<xs:complexType mixed="true" name="xmlDoc">
<xs:sequence>
<xs:any namespace="##other" processContents="skip"/>
</xs:sequence>
</xs:complexType>
jaxb中是否有任何注释参数,我可以使用它来控制任何元素类型的命名空间。我需要## any而不是## other。 这可能吗?
答案 0 :(得分:0)
没有参数来控制细节的输出。但是当生成wsdl时,如果我将命名空间的参数修改为## any,它将允许转换为现有数据类型并按要求工作。
答案 1 :(得分:0)
正如我在上面的评论中所提到的,我查看了参考实现的来源,发现XmlSchemaGenerator只是为编写了 ## other 的硬编码任何元素。
因此,在使用以下方法生成文件后,我现在用 ## any 替换 ## other :
private static void fixNamespaceOfAnyElementsFor(final File xsdFile) throws IOException, FileNotFoundException {
final File tempFile = File.createTempFile("your_prefix", ".tmp");
Files.move(xsdFile.toPath(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
try (final BufferedWriter writer = Files.newBufferedWriter(xsdFile.toPath())) {
try (final Stream<String> lines = Files.lines(tempFile.toPath())) {
lines.map(line -> line.replace("namespace=\"##other\"", "namespace=\"##any\""))
.forEach(line -> {
try {
writer.write(line);
writer.newLine();
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
});
}
}
Files.delete(tempFile.toPath());
}
它基本上将文件移动到临时文件夹,以便我可以在原始位置重写它,替换属性值。完成后,临时文件将被删除。
注意:首先,我使用DOM和Stax探索了解决方案,但它们都搞砸了生成器的原始格式(漂亮打印)。由于我将生成的XSD提交给git并且需要在每一代上使用一致的格式,所以我决定采用简单的逐行解决方案。