jaxb anyelement命名空间而不是其他

时间:2017-07-22 09:01:13

标签: java jaxb

我有一个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。 这可能吗?

2 个答案:

答案 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并且需要在每一代上使用一致的格式,所以我决定采用简单的逐行解决方案。