我有一个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>
答案 0 :(得分:2)
您应该使用@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获取节点...并将其封送到您的Container(同时还有@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();
}
}
off-course,此代码丑陋且效率不高。我会在提交前重构它。