【问题标题】:Accept any name as XML element - JAXB, CXF接受任何名称作为 XML 元素 - JAXB、CXF
【发布时间】:2011-01-19 10:23:55
【问题描述】:

我有一个 XML 文档,其中包含元素 <elementName>,并在 WSDL 文件中设置了层次结构。生成的类(来自 WSDL 文件)正确映射所有内容(CXF 会这样做)。但是如果我需要接受<elementName> 的每个名字怎么办?如何接受任何名称并具有正确的层次结构?我希望你能理解我要解释的内容:)

我尝试使用@XmlElement(name="")@XmlElement(name="*"),但没有成功。

更新:

@XmlAnyElement
protected Container c;

而且我想把每个元素都映射在XML中的同一级别就可以了。

具体来说,我希望将这两个示例映射到同一个类(如上的 Container.class):

... XML hierarchy ...
    <element>
        ... XML content ...
    </element>

... XML hierarchy ...
    <elementWithUglyNameaodsafh>
        ... same XML content as above...
    </elementWithUglyNameaodsafh>

【问题讨论】:

  • 您希望 jaxb 识别内容与 Container 匹配,还是希望每个 uglyElement 都是 Container?
  • 查看我的更新,这是一个合适的解决方案吗?

标签: java xml wsdl jaxb cxf


【解决方案1】:

你应该使用@XmlAnyElement 在这里查看信息:
http://jaxb.java.net/tutorial/section_6_2_7_6-Collecting-Unspecified-Elements-XmlAnyElement.html#Collecting%20Unspecified%20Elements:%20XmlAnyElement

例如:

 public class ZooType {
    protected List<Element> animals;
    public ZooType(){
    }

    @XmlAnyElement
    public List<Element> getAnimals(){
        if( animals == null ) animals = new ArrayList<Element>();
        return animals;   
    }
    public void setAnimals( List value ){
        animals = value;
    }
}

您可以稍后提取元素名称和值:

for( Element el: doc.getZoo().getAnimals() ){
    System.out.println( el.getNodeName() + "->" +
                        el.getTextContent() );
}

编辑

作为对问题更新的回应,我可以提供一个变通解决方案。

对不起,我从来没有编写过 XML,所以可能有更好的方法来进行元素包装和替换。

底线是:使用@XmlAnyElement 获取节点...并将其编组到您的容器(其中也有@XmlRootElement 注释)

@XmlRootElement
public class Root {

public Container c;

@XmlAnyElement
public void setElements(Element e) throws JAXBException, ParserConfigurationException {
    Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    Element container = d.createElement("container");
    d.appendChild(container);
    Node node = d.adoptNode(e.getFirstChild());
    container.appendChild(node);
    c = (Container) JAXBContext.newInstance(Container.class).createUnmarshaller().unmarshal(d);
}

public Element getElements() {
    throw new UnsupportedOperationException();
}
}

当然,这段代码丑陋而且效率低下。我会在提交之前对其进行重构。

【讨论】:

  • 如果我使用这个,我会得到这个错误:Unmarshalling Error: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to ....。我怎样才能把它投射到我的班级?
  • @ekeren:我做到了。但我有一个属性,我想在 XML 上映射 &lt;asdasda&gt;&lt;element&gt;&lt;xyz&gt; 或其他同级别的名称。它只是不起作用......
  • @Tom:我不确定我是否完全理解你的问题,你能用代码编辑你的问题吗?
  • 如果您将 lax=true 添加到 @XmlAnyElement,您将获得对象内容,假设存在具有兼容根元素的域类。欲了解更多信息,请查看:bdoughan.blogspot.com/2010/08/…
  • 您的解决方案有效。我发现@XmlJavaTypeAdapter 可用于创建自己的(非)编组类。非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 2012-06-23
  • 2013-07-05
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多