Примите любое имя как элемент XML - JAXB, CXF - PullRequest
2 голосов
/ 19 января 2011

У меня есть XML-документ, элемент <elementName> и иерархия в файле WSDL.Сгенерированный класс (из файла WSDL) отображает все правильно (CXF делает это).Но что, если мне нужно принять <elementName> с каждым именем?Как я могу принять любое имя и иметь правильную иерархию?Надеюсь, вы понимаете, что я пытаюсь объяснить:

1004 * Я пытался использовать @XmlElement(name="") и @XmlElement(name="*"), но это не сработало.

ОБНОВЛЕНИЕ1010 *

@XmlAnyElement
protected Container c;

И я хочу отобразить на нем каждый элемент на одном уровне в XML.

Чтобы быть точным, я хочу, чтобы эти два примера были сопоставлены в один класс (контейнеркласс, как указано выше):

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

или

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

1 Ответ

2 голосов
/ 19 января 2011

Вы должны использовать @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();
}
}

конечно, этот код некрасив и не эффективен .Я бы переделал его перед коммитом.

...