JAX-WS - 如何从服务器端代码创建类型为 xs:any 的元素?

Jim*_*my 4 java xml xsd web-services jax-ws

我为我的 Web 服务创建了一个 XML 模式,ServerResponse 的元素包含一个无限制的 xs:any 类型元素序列。

我正在从我的模式生成类(使用 xjc),因此这个序列在生成的 ServerResponse 类中被转换为 List。

ServerResponse 类有一个方法 getAny(),它返回这个 List 并允许我对其进行更改......但我无法确切地弄清楚如何做到这一点。

假设我想向响应中任何对象的序列添加几个元素,以便响应的 XML 将包含它。

<someelement1>sometext</someelement1>
<someelement2>somemoretext</someelement2>
Run Code Online (Sandbox Code Playgroud)

从 Java 服务器端代码,我将如何将这两个元素添加到 getAny() 对象?我认为可以这样做:

Object element = new Object();
((Element)element).setNodeValue("someelement1");
((Element)element).setTextContent("sometext");
requestobject.getAny().add(element);
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为它会抛出一个错误,指出“java.lang.object cannot be cast to org.w3.dom.Element”。

谁能帮我做到这一点?我相信有一个非常简单的解决方案!

谢谢你的帮助 :)

McD*_*ell 5

Object没有实现Element,所以这个演员总是会失败。

您可以Element使用DocumentBuilderDocumentBuilderFactory.

下面是一些示例 JAXB 代码:

@XmlRootElement
public class Anything {
  private Object any;

  @XmlAnyElement
  public Object getAny() { return any; }
  public void setAny(Object any) { this.any = any; }

  public static void main(String[] args) throws DOMException,
      ParserConfigurationException {
    Element foo = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder()
        .newDocument()
        .createElement("foo");
    Anything a = new Anything();
    a.setAny(foo);
    JAXB.marshal(a, System.out);
  }
}
Run Code Online (Sandbox Code Playgroud)

我还没有在 JAX-WS 下尝试过这个(JAX-WS 使用 JAXB 绑定)——如果它不起作用,我会开始挖掘javax.xml.soap包。