Re: xmlOutputter question
"Joe Bowbeer" <[email protected]>
| Newsgroups | gmane.comp.java.jdom.general |
|---|---|
| Message-ID | <[email protected]> |
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...
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]