Re: xmlOutputter question
Rick <[email protected]>
| Newsgroups | gmane.comp.java.jdom.general |
|---|---|
| Message-ID | <[email protected]> |
Ok, the problem is solved. It seems that the app on the server is acting in a non-standard way. Even though it apparently supports atom and rss, I couldn't post to it successfully using jdom or RoME. My only hope lay in constructing the correct string and parsing it with jdom to post to the server. It worked after I reverse engineered the string. A tip for those going down this path is to strip the prologue from the xml string before parsing it with a SAXBuilder. The SAXBuilder will add the correct prologue before posting. On Mon, Jan 19, 2009 at 8:27 PM, Rick Avlonitis <[email protected]>wrote: > Thank you for the link (although it's in php). That root *entry* I got > from some C# example. I'm trying to implement a form of ReSTful webservice, > where I call a URI (discovery will be through ROME, I suspect) and parse the > xml with jdom (at least it does that well ;). In order to change the text > values of the elements, I will have to iterate through them (jdom). Then I > put them back together in a document and PUT them back on the server. That > was the theory :( > > You are right in noticing the empty first element - that slipped past my > eye. Although I did get this damnable code PUTting to the server with a > document parsed from a file (the file being the result of a jdom document > output). That there made me think the jdom api was fishy ;) I'll try ROME > and report back. > > > On Mon, Jan 19, 2009 at 7:58 PM, Joe Bowbeer <[email protected]>wrote: > >> What you're putting doesn't like like a valid atom post. >> >> The root should be a *feed* instead of an *entry*, right? >> >> And that empty *entry* in the first element doesn't look right. >> >> See sample feed here: >> >> http://www.ibm.com/developerworks/library/x-tipatom2/ >> >> Yes, I'd recommend using ROME, which itself uses JDOM. >> >> Joe >> >> On Mon, Jan 19, 2009 at 9:45 AM, Rick Avlonitis wrote: >> >>> I may be wrong here, but it seems that JDom is perhaps not the choice to >>> use when posting to an atom feed. I say this because I can output a >>> document to a file with no problems. However, I can't out the document to >>> an http stream. I've wrapped the stream in a buffer and called flush on it >>> to no avail. I know that there isn't a problem with the stream, because >>> when I create a new document from the file where I output to originally, it >>> works. But I don't want to have to write to a file (or even a string). I >>> want to find a solution that works. My solution is fine until I want to >>> post the results back to the server :(. Perhaps ROME is the way to go? >>> >>> >>> On Mon, Jan 19, 2009 at 7:11 PM, Joe Bowbeer wrote: >>> >>>> On Mon, Jan 19, 2009 at 9:08 AM, Joe Bowbeer wrote: >>>> >>>>> What's the diff between the two documents created in the two different >>>>> ways? >>>>> >>>>> Also, what's your root element? >>>>> >>>>> The snippet below looks like nothing more than an empty "entry" >>>>> element: >>>>> >>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>> <entry><entry /> ...ignored... >>>> >>>> >>>> >>>> >>>> Update: Nope, I got that wrong. The document itself is an "entry" and >>>> the first element is an empty "entry". >>>> >>>> Joe >>>> >>>> >>>> >>>>> >>>>> >>>>> On Mon, Jan 19, 2009 at 1:15 AM, Rick Avlonitis wrote: >>>>> >>>>>> Thank you for the inputs. However, I have to disagree. My problem >>>>>> can be distilled like so: >>>>>> >>>>>> If I create a document from an ArrayList<Element> and try to post, the >>>>>> server doesn't update. >>>>>> If I create a document by parsing the file made from a document that >>>>>> was made from ArrayList<Element> and post, the server updates. >>>>>> >>>>>> This makes me think that the http output stream is not at fault, since >>>>>> it works for the case for the document built from a parsed file. (I have >>>>>> also since wrapped the httpOutputStream in a bufferedStreamReader and called >>>>>> flush(). Still nothing). It makes me think that there is a setting which >>>>>> is read from the parsed file which is not read from the ArrayList<Element>. >>>>>> >>>>>> So the above makes me wonder if ArrayList<Element> is a suitable list >>>>>> to work with. What other container could I use? >>>>>> >>>>>> Regards, >>>>>> Rick >>>>>> >>>>>> On Sat, Jan 17, 2009 at 1:49 AM, Joe Bowbeer wrote: >>>>>> >>>>>>> I agree with Jason that you should close the output stream (which >>>>>>> will also flush) before getting the response code. >>>>>>> >>>>>>> Also, if you're going to be doing a lot of http processing I >>>>>>> recommend using Apache's httpclient instead of dealing with Java's >>>>>>> HttpConnection directly. >>>>>>> >>>>>>> >>>>>>> On Fri, Jan 16, 2009 at 5:26 AM, Rick Avlonitis wrote: >>>>>>> >>>>>>>> When I call xmlOutputter.output(docForPosting, >>>>>>>> http.getOutputStream()), this fails to update the data but I get: (Response >>>>>>>> Code: 200, Response Message: OK). >>>>>>>> But when I write the docForPosting to a file and then create a new >>>>>>>> document from the parsed file, I can successfully update the data (Response >>>>>>>> Code: 200, Response Message: OK). >>>>>>>> >>>>>>>> Why can I not put data successfully on the server with >>>>>>>> xmlOutputter.output(docForPosting, http.getOutputStream())? >>>>>>>> >>>>>>>> Your help will be appreciated. My code is below: >>>>>>>> >>>>>>>> >>>>>>>> package myJDom; >>>>>>>>> >>>>>>>>> import org.jdom.*; >>>>>>>>> import org.jdom.input.DOMBuilder; >>>>>>>>> import org.jdom.input.SAXBuilder; >>>>>>>>> import org.jdom.output.XMLOutputter; >>>>>>>>> import org.xml.sax.SAXException; >>>>>>>>> >>>>>>>>> import java.io.File; >>>>>>>>> import java.io.FileWriter; >>>>>>>>> import java.io.IOException; >>>>>>>>> import java.net.Authenticator; >>>>>>>>> import java.net.HttpURLConnection; >>>>>>>>> import java.net.URISyntaxException; >>>>>>>>> import java.net.URL; >>>>>>>>> import java.net.URLConnection; >>>>>>>>> import java.util.ArrayList; >>>>>>>>> import java.util.List; >>>>>>>>> >>>>>>>>> import javax.xml.parsers.DocumentBuilder; >>>>>>>>> import javax.xml.parsers.DocumentBuilderFactory; >>>>>>>>> import javax.xml.parsers.ParserConfigurationException; >>>>>>>>> >>>>>>>>> public class MyJDomParser { >>>>>>>>> protected List<Element> rawElementList = new >>>>>>>>> ArrayList<Element>(); >>>>>>>>> protected List<Element> scrubbedElementList = new >>>>>>>>> ArrayList<Element>(); >>>>>>>>> protected List<Element> newElementList = new >>>>>>>>> ArrayList<Element>(); >>>>>>>>> protected SAXBuilder saxBuilder = new SAXBuilder(); >>>>>>>>> protected DOMBuilder domBuilder = new DOMBuilder(); >>>>>>>>> protected Document rawDoc = new Document(); >>>>>>>>> protected Element element; >>>>>>>>> >>>>>>>>> @SuppressWarnings("unchecked") >>>>>>>>> public void parseUrl() throws JDOMException, IOException { >>>>>>>>> System.out.println("preparing to parse the elements..."); >>>>>>>>> URL url = new URL( >>>>>>>>> " >>>>>>>>> http://192.168.1.199:3334/sdata/slx/dynamic/accounts(A6UJ9A000036)<http://192.168.1.199:3334/sdata/slx/dynamic/accounts%28A6UJ9A000036%29> >>>>>>>>> "); >>>>>>>>> saxBuilder.setIgnoringElementContentWhitespace(true); >>>>>>>>> rawDoc = saxBuilder.build(url); >>>>>>>>> >>>>>>>>> element = rawDoc.getRootElement(); >>>>>>>>> rawElementList.addAll(element.getChildren()); >>>>>>>>> >>>>>>>>> for (int i = 0; i < 3; i++) {// remove 2 useless elements >>>>>>>>> rawElementList.remove(0); >>>>>>>>> } >>>>>>>>> >>>>>>>>> for (int i = 0; i < rawElementList.size(); i++) { >>>>>>>>> String s = rawElementList.get(i).getText(); >>>>>>>>> if (s != null && s != "") { >>>>>>>>> scrubbedElementList.add(rawElementList.get(i)); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> for (Element e : scrubbedElementList) { >>>>>>>>> System.out.println(e.getText()); >>>>>>>>> } >>>>>>>>> // for (Element e : rawElementList) { >>>>>>>>> // System.out.println(e.getText()); >>>>>>>>> // } >>>>>>>>> } >>>>>>>>> >>>>>>>>> public void getAllChangedElements() throws URISyntaxException { >>>>>>>>> System.out.println("preparing to change the data..."); >>>>>>>>> Element entry = new Element("entry"); >>>>>>>>> entry.addNamespaceDeclaration(Namespace.getNamespace("")); >>>>>>>>> newElementList.add(entry); >>>>>>>>> // rawElementList.add(entry); >>>>>>>>> >>>>>>>>> for (int i = 0; i < scrubbedElementList.size(); i++) { >>>>>>>>> String s = scrubbedElementList.get(i).getText(); >>>>>>>>> String name = scrubbedElementList.get(i).getName(); >>>>>>>>> if (s != null && s != "") { >>>>>>>>> if (name == "AccountName") { >>>>>>>>> s = "****55555******"; >>>>>>>>> } >>>>>>>>> Element e = new Element(name); >>>>>>>>> e.setText(s); >>>>>>>>> newElementList.add(e); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> // return newData; >>>>>>>>> // for (Element e : newElementList) { >>>>>>>>> // System.out.println(e.getText()); >>>>>>>>> // } >>>>>>>>> } >>>>>>>>> >>>>>>>>> public void postData() throws IOException, JDOMException, >>>>>>>>> ParserConfigurationException, SAXException { >>>>>>>>> // building a document from DOM >>>>>>>>> DocumentBuilderFactory dbfac = >>>>>>>>> DocumentBuilderFactory.newInstance(); >>>>>>>>> DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); >>>>>>>>> org.w3c.dom.Document docPrepareToPost = >>>>>>>>> docBuilder.newDocument(); >>>>>>>>> >>>>>>>>> // create my root element >>>>>>>>> org.w3c.dom.Element root = >>>>>>>>> docPrepareToPost.createElement("entry"); >>>>>>>>> docPrepareToPost.appendChild(root); >>>>>>>>> >>>>>>>>> // add elements to my dom doc >>>>>>>>> for (int i = 0; i < newElementList.size(); i++) { >>>>>>>>> org.w3c.dom.Element child = docPrepareToPost >>>>>>>>> >>>>>>>>> .createElement(newElementList.get(i).getName()); >>>>>>>>> child.setTextContent(newElementList.get(i).getText()); >>>>>>>>> root.appendChild(child); >>>>>>>>> } >>>>>>>>> >>>>>>>>> // parsing my doc from the file allows me a successful post >>>>>>>>> // FileWriter fs = new >>>>>>>>> FileWriter("/home/rick/deleteme/crap2"); >>>>>>>>> // //posting is successful from this parsed file >>>>>>>>> // xmlOutputter.output(docForPosting, fs); >>>>>>>>> >>>>>>>>> DocumentBuilderFactory factory = >>>>>>>>> DocumentBuilderFactory.newInstance(); >>>>>>>>> docPrepareToPost = factory.newDocumentBuilder().parse( >>>>>>>>> new File("/home/rick/deleteme/crap2")); >>>>>>>>> >>>>>>>>> // setting up the stream >>>>>>>>> URL url = new URL( >>>>>>>>> " >>>>>>>>> http://192.168.1.199:3334/sdata/slx/dynamic/accounts(A6UJ9A000036)<http://192.168.1.199:3334/sdata/slx/dynamic/accounts%28A6UJ9A000036%29> >>>>>>>>> "); >>>>>>>>> URLConnection connection = url.openConnection(); >>>>>>>>> connection.setDoOutput(true); >>>>>>>>> java.net.HttpURLConnection http = (HttpURLConnection) >>>>>>>>> connection; >>>>>>>>> http.setRequestMethod("PUT"); >>>>>>>>> HttpURLConnection.setFollowRedirects(true); >>>>>>>>> http.setRequestProperty("Content-type", >>>>>>>>> "application/atom+xml;type=entry"); >>>>>>>>> >>>>>>>>> // creating a JDom doc from the DOM doc to facilitate >>>>>>>>> streaming to the >>>>>>>>> // server >>>>>>>>> org.jdom.Document docForPosting = >>>>>>>>> domBuilder.build(docPrepareToPost); >>>>>>>>> >>>>>>>>> XMLOutputter xmlOutputter = new XMLOutputter(); >>>>>>>>> //this fails to update the data (Response Code: 200, >>>>>>>>> Response Message: OK) >>>>>>>>> xmlOutputter.output(docForPosting, http.getOutputStream()); >>>>>>>>> >>>>>>>>> //output seems ok >>>>>>>>> xmlOutputter.output(docForPosting, System.out); >>>>>>>>> //the printout seems ok >>>>>>>>> System.out.println("doctype = " + >>>>>>>>> docForPosting.getDocType()); //=null >>>>>>>>> FileWriter file = new >>>>>>>>> FileWriter("/home/rick/deleteme/crap2"); >>>>>>>>> //this successfully updates the data (Response Code: 200, >>>>>>>>> Response Message: OK) >>>>>>>>> xmlOutputter.output(docForPosting, file); >>>>>>>>> >>>>>>>>> System.out.println("Response Code: " + >>>>>>>>> http.getResponseCode()); >>>>>>>>> System.out.println("Response Message: " + >>>>>>>>> http.getResponseMessage()); >>>>>>>>> } >>>>>>>>> >>>>>>>>> public static void main(String[] args) { >>>>>>>>> MyJDomParser parser = new MyJDomParser(); >>>>>>>>> Authenticator.setDefault(new MyAuthenticator()); >>>>>>>>> try { >>>>>>>>> parser.parseUrl(); >>>>>>>>> parser.getAllChangedElements(); >>>>>>>>> parser.postData(); >>>>>>>>> } catch (JDOMException e) { >>>>>>>>> e.printStackTrace(); >>>>>>>>> } catch (IOException e) { >>>>>>>>> e.printStackTrace(); >>>>>>>>> } catch (URISyntaxException e) { >>>>>>>>> e.printStackTrace(); >>>>>>>>> } catch (ParserConfigurationException e) { >>>>>>>>> e.printStackTrace(); >>>>>>>>> } catch (SAXException e) { >>>>>>>>> e.printStackTrace(); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>> >>>>>>>> *Output (snipped):* >>>>>>>> >>>>>>>> preparing to change the data... >>>>>>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>>>>>> <entry><entry >>>>>>>>> /><published>0001-01-01T00:00:00+00:00</published><title>**------**</title><updated>2009-01-16T12:38:38+00:00</updated><AccountName>****55555******</AccountName><AccountNameUpper>**SHORTENED**</AccountNameUpper><CreateDate>2008-10-21T09:01:41+00:00</CreateDate><CreateUser>U6UJ9A000009</CreateUser><LastHistoryBy>ADMIN >>>>>>>>> </LastHistoryBy><LastHistoryDate>2008-10-31T13:25:58+00:00</LastHistoryDate><ModifyDate>2009-01-16T12:38:38+00:00</ModifyDate><ModifyUser>ADMIN >>>>>>>>> </ModifyUser><Status>Active</Status><Type>Corporate</Type><Prefix>Mr.</Prefix><Name>Bob</Name><Surname>Smith</Surname><Gender>Male</Gender><Idtype>I.D.</Idtype><Idpassportno>7904055766543</Idpassportno><Citizen>RSA</Citizen></entry> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> To control your jdom-interest membership: >>>>>>> >>>>>>> http://www.jdom.org/mailman/options/jdom-interest/[email protected] >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> _______________________________________________ >>>> To control your jdom-interest membership: >>>> http://www.jdom.org/mailman/options/jdom-interest/[email protected] >>>> >>> >>> >> >> _______________________________________________ >> To control your jdom-interest membership: >> http://www.jdom.org/mailman/options/jdom-interest/[email protected] >> > > _______________________________________________ To control your jdom-interest membership: http://www.jdom.org/mailman/options/jdom-interest/[email protected]