【问题标题】:setting namespace of objects dynamically in jaxb marshalling在 jaxb 编组中动态设置对象的命名空间
【发布时间】:2012-04-08 19:54:36
【问题描述】:

我有一种情况,我需要为我的 jaxb 类动态设置命名空间。我在 jaxb 类中的命名空间有一个需要动态更改的版本。

 @XmlRootElement(name = "myobject",namespace="http://myhost.com/version-2")
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType
 public class myObject{

 }

当我使用这种静态命名空间机制时,我的编组工作完美,但在我的实际情况下,我需要动态更改此版本..

我在编组时尝试了这种方法来解决这个问题

 XMLStreamWriter xmlStreamWriter =     
 XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter);
 String uri = "http://myhost.com/ver-"+version;

//xmlStreamWriter.setDefaultNamespace(uri);
xmlStreamWriter.writeStartDocument("1.0");

xmlStreamWriter.writeNamespace("ns1", uri);

我尝试使用 setDefaultNamespace 没有成功,并且 writeNamespace 给我一个错误 无效状态:开始标签未在 writeNamespace 中打开

我们非常感谢任何有关如何解决此问题的意见。

【问题讨论】:

标签: xml xml-serialization jaxb marshalling jaxb2


【解决方案1】:

您可以实现一个XMLStreamWriter,它将所有调用委托给原始编写器,但会覆盖writeNamespace(...) 方法:

public void writeNamespace(String prefix, String uri) {
  if ("http://myhost.com/version-2".equals(uri) {
    uri = "http://myhost.com/version-" + version;
  }
  delegate.writeNamespace(prefix, uri);
}

【讨论】:

  • 当我尝试覆盖这个时.. xmlStreamWriter.writeNamespace("ns2", myhost.com /version-2);我收到此错误.. 无效状态:未在 writeNamespace(ns2, myhost.com/version-2) 处打开开始标签
  • 请尝试以相同的方式覆盖 startElement(String uri,...) 和 setPrefix(...) 方法。基本上,每个获取 namespaceURI 参数的方法都需要进行命名空间转换。
  • 因为我只想在 xml 的根元素中添加名称空间版本,所以我做了这个技巧。我有这样的 xml 注释模型类 @XmlRootElement(name = "myobject" ,namespace="myhost.com /version-") @XmlAccessorType(XmlAccessType.FIELD) @XmlType public class myObject{ }
  • 提供的版本类似于版本- 并且在传递要编组的 xml 之前,我以编程方式将版本号添加到 xml 字符串中。 if(version == 1){ String ns = "myhost.com/version-"+version;问题是解组时如何解决这个问题?
【解决方案2】:

您是否考虑过使用 XSL-T 转换?根据您的架构,在编组后替换命名空间可能相对简单。

【讨论】:

  • 这个性能怎么样。。感觉编组后再次读取dom树的性能会影响性能。为什么我在创建 xml 流编写器时不能使用默认命名空间或类似的东西?
  • 我想我记得存在流式 XSL 处理器。它们的功能有限,但对于如此简单的任务应该没问题。
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2015-05-21
相关资源
最近更新 更多