Я работаю над клиентским приложением веб-сервисов, и оно у меня в основном работает. Я могу получать и читать данные со стороннего веб-сервиса нормально. Теперь мне нужно предоставить некоторые данные, и я застрял.
Классы для объектов, которые я извлекаю / отправляю, были сгенерированы из файлов XSD с помощью инструмента xjc. Часть, на которой я застрял, превращает один из этих объектов в дерево XML для отправки в веб-сервис.
Когда я получаю / отправляю запрос от / к ws, он содержит объект «полезной нагрузки». Это определено в Java-коде как (частичный листинг):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PayloadType", propOrder = {
"compressed",
"document",
"any",
"format"
})
public class PayloadType {
@XmlElement(name = "Compressed")
protected String compressed;
@XmlElement(name = "Document")
protected List<String> document;
@XmlAnyElement
protected List<Element> any;
protected String format;
public List<Element> getAny() {
if (any == null) {
any = new ArrayList<Element>();
}
return this.any;
}
}
Единственное поле, которое меня интересует, это поле any, которое содержит дерево XML. Когда я получаю данные из ws, я читаю это поле примерно так:
('root' имеет тип org.w3c.dom.Element и является результатом вызова getAny (). get (0) 'для объекта полезной нагрузки)
NodeList nl = root.getElementsByTagName("ns1:Process"); // "ns1:Process" is an XML node to do something with
if (nl != null && nl.getLength() > 0) {
for (int i = 0; i < nl.getLength(); i++) {
Element proc = (Element) nl.item(i);
try {
// do something with the 'proc' Element here...
} catch (Exception ex) {
// handle problems here...
}
}
}
Отправка данных - вот где я застрял. Как мне взять объект Java, созданный из одного из классов, созданных из XSD, и превратить его в объект Element, который я могу добавить в «любой» список объекта полезной нагрузки? Например, если у меня есть класс DailyData, и я создаю и заполняю его данными:
DailyData dData = new DailyData();
dData.setID = 34;
dData.setValues = "3,5,76,23";
Как добавить этот объект «dData» в «любой» список объекта полезной нагрузки? Это должен быть Элемент. Я делаю что-то с маршаллером JAXBContext? Я использовал это, чтобы вывести объект 'dData' на экран, чтобы проверить структуру XML.
Я уверен, что ответ смотрит мне в лицо, но я просто не вижу этого!
Dave
ОБНОВЛЕНИЕ: Получил работу с приведенным ниже фрагментом кода:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = dbf.newDocumentBuilder().newDocument();
JAXBContext context = JAXBContext.newInstance(DailyData.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(dData, doc);
PayloadType payload = new PayloadType();
payload.getAny().add((Element)doc.getFirstChild());