Natürlich gibt es eine Menge xml-frameworks. Aber ist es nicht ziemlicher overkill, mit diesen doch recht mächtigen apis rumzufuhrwerken, nur weil man eine einfache SOAP-Nachricht erstellen will, die über HTTPClient an SAP geschickt wird und dessen Rückgabe dann mit SAX geparsed werden soll.
Das bläht den code unnötig auf und verwirrt die Kunden-Organisation.
Deshalb hab ich ein einfaches xml Framework geschrieben, das xml als eine Baumstruktur ansieht, die erst aufgebaut und dann als String herausgeschrieben wird. Indentierung ist optional. Attribute werden nicht unterstützt, da ich es noch nicht brauche. Wäre aber einfach eine weitere Klasse.
Dieses xml Dokument
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="urn:sap-com:document:sap:rfc:functions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<q0:ZZZWF_SEND_DATA_TO_LOTUS_NOTES>
<WEB_HEADER_DATA>
<ARCHIVE_DOC_URL>
dsvsdv
</ARCHIVE_DOC_URL>
<DOC_NUMBER>
12121
</DOC_NUMBER>
<COMPANY_CODE>
</COMPANY_CODE>
</WEB_HEADER_DATA>
<WEB_ITEM_DATA>
<item>
<DOC_NUMBER>
213
</DOC_NUMBER>
<WF_STATUS_ITEM>
da
</WF_STATUS_ITEM>
</item>
</WEB_ITEM_DATA>
</q0:ZZZWF_SEND_DATA_TO_LOTUS_NOTES>
</soapenv:Body>
</soapenv:Envelope>
wird mit diesem code erzeugt:
XmlRootElement xmlRootElement = new XmlRootElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "soapenv:Envelope", "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:q0=\"urn:sap-com:document:sap:rfc:functions\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", 0);
AXmlElement body = xmlRootElement.addXmlElement(xmlRootElement, "soapenv:Body");
AXmlElement zzwf = xmlRootElement.addXmlElement(body, "q0:ZZZWF_SEND_DATA_TO_LOTUS_NOTES");
AXmlElement webHeaderData = xmlRootElement.addXmlElement(zzwf, "WEB_HEADER_DATA");
xmlRootElement.addXmlElementWithTextContent(webHeaderData, "ARCHIVE_DOC_URL", "dsvsdv");
xmlRootElement.addXmlElementWithTextContent(webHeaderData, "DOC_NUMBER", "12121");
xmlRootElement.addXmlElement(webHeaderData, "COMPANY_CODE");
AXmlElement webItemData = xmlRootElement.addXmlElement(zzwf, "WEB_ITEM_DATA");
AXmlElement item = xmlRootElement.addXmlElement(webItemData, "item");
xmlRootElement.addXmlElementWithTextContent(item, "DOC_NUMBER", "213");
xmlRootElement.addXmlElementWithTextContent(item, "WF_STATUS_ITEM", "da");
System.out.println(xmlRootElement.toXml());
Man kann das noch weiter verkürzen. Ich halte das für eine Menge Aufgaben für effizienter als Dom, JDom und wie sie alle heissen.
Falls jemand Interesse hat, kann ich das verschicken. Nach meinen Problemen mit stubby, denke ich darüber nach meine low level Art der Webservice Programmierung, die für SOAP
und REST in Domino funktioniert, zu openSourcen. Keine Probleme mit reverse proxys (offenbar im Gegenteil zu stubby), wirklich transparent und erzeugt nicht Unmengen von Klassen wie Axis und alles, das darauf beruht (stubby z.B.)
In den Methoden gibt man einfach als ersten Parameter den Parent der Node an. Es gibt spezielle Factory-Methoden für einfache Elemente, Elemente mit Namespace-Deklarationen, Elemente mit Text-Inhalt sowie Elemente mit Namespace-Deklarationen und Text-Inhalt.
Den so aufgestellten Baum kann man dann mit einer einfachen toXml() Methode als xml ausgeben.
Man könnte das auch für Json erweitern.
Gruß Axel