我有一个 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>
最佳答案
你应该使用@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();
}
}
当然,这段代码丑陋并且效率不高。我会在提交之前重构它。
关于java - 接受任何名称作为 XML 元素 - JAXB、CXF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734104/