接受任何名称作为XML元素 - JAXB,CXF

时间:2011-01-19 10:23:55

标签: java xml wsdl jaxb cxf

我有一个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>

1 个答案:

答案 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,此代码丑陋效率不高。我会在提交前重构它。