Je travaille sur une application client webservices et je l'ai surtout fonctionné. Je peux récupérer et lire des données provenant du service Web d'une tierce partie. Maintenant, je dois soumettre des données et je suis coincé.Objet Java aux éléments XML?
Les classes pour les objets que je récupère/soumets ont été générées à partir de fichiers XSD via l'outil xjc. La partie sur laquelle je suis coincé transforme un de ces objets en un arbre XML à soumettre au service web.
Lorsque je récupère/envoie une requête de/vers le ws, il contient un objet 'payload'. Il est défini dans le code Java (liste partielle):
@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;
}
}
Le seul domaine qui me préoccupe est le champ « tout » qui contient un arbre XML. Quand je récupère des données du ws, j'ai lu ce champ avec quelque chose comme ceci: ('root' est de type org.w3c.dom.Element et est le résultat de l'appel 'getAny(). Get (0)' sur le objet de charge utile)
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...
}
}
}
La soumission de données est l'endroit où je suis bloqué. Comment puis-je prendre un objet java créé à partir de l'une des classes générées à partir de XSD et le transformer en un objet Element que je peux ajouter à la liste «any» de l'objet de charge utile? Par exemple, si j'ai une classe DailyData et je crée et le remplir avec des données:
DailyData dData = new DailyData();
dData.setID = 34;
dData.setValues = "3,5,76,23";
Comment puis-je ajouter cet objet « DData » à la « une » liste de l'objet de la charge utile? Cela doit être un élément. Est-ce que je fais quelque chose avec un marshaller de JAXBContext? J'ai utilisé cela pour vider l'objet 'dData' à l'écran pour vérifier la structure XML.
Je suis sûr que la réponse me regarde dans le visage mais je ne peux pas le voir!
Dave
MISE À JOUR: Got it travailler avec l'extrait de code ci-dessous:
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());
I * pense * que je l'ai compris mais je Je ne saurai pas avec certitude jusqu'à ce que nous ayons des données de test dans notre environnement DEV Je posterai ma réponse si elle s'avère correcte – DaveKub
Vous auriez dû répondre à votre propre question, parce que j'aurais voté :-) est le plus utile. – rds