Thank you for your input Andrei. I had been relying on LoggingOutInterceptor messages to see what the XML looked like so I thought maybe it was not accurate so I changed it to post the XML to a localhost endpoint and rely on server side logging to see what the XML payload looked like. It confirmed the behavior I was seeing before.
Then I tried bumping up my version number from 2.7.0 to 2.7.5 and I am seeing much different behavior now - it matches how you describe it should be working. So I guess it was a bug that was fixed at some point. If I have to specify the element values when I call setInAppendElements, I guess I'll have to be manipulating the TransformOutInterceptor a lot more frequently than I had anticipated. Do I also need to handle escaping of XML entity characters? On Wed, May 29, 2013 at 7:05 AM, Andrei Shakirin <[email protected]>wrote: > Hi Greg, > > Sergei is in vacation this week, I will try to answer your question. > > transformOutInterceptor.setOutTransformElements(Collections.singletonMap("{ > http://something}Child1", "")) should remove only Child1 element with all > his children. > Not sure why it results removing Parent children, are you sure with that > test? > > What you basically need to delete and elements and insert it in different > order is something like this: > > transformOutInterceptor.setOutTransformElements(Collections.singletonMap("{ > http://something}Child2", "")); > transformOutInterceptor.setInAppendElements(Collections.singletonMap("{ > http://something}Child1", "{http://something}Child2=Another Value")); > > If it not enough you can use XSLT Feature > http://cxf.apache.org/docs/xslt-feature.html to apply any XSLT script to > your request/response. > > Other alternative is to create own interceptor, put it to POST_PROTOCOL > phase and sort elements in message payload as you want. > > Regards, > Andrei. > > > -----Original Message----- > > From: Greg Barker [mailto:[email protected]] > > Sent: Samstag, 25. Mai 2013 02:09 > > To: [email protected] > > Subject: Re: Specifying order of XML elements at runtime? > > > > Thanks for the quick reply Sergey! > > > > I'm having a bit a trouble with the suggested solution though, almost > > certainly a pilot error on my part I assume. > > > > XML before: > > <Container xmlns="http://something"> > > <Parent> > > <Child1>Some Value</Child1> > > <Child2>Another Value</Child2> > > </Parent> > > </Container> > > > > So I tried: > > transformOutInterceptor.setOutDropElements(Collections.singletonList("{ > > http://something}Child1")); > > > > Which results in: > > <Container xmlns="http://something"> > > <Parent> > > Some Value > > <Child2>Another Value</Child2> > > </Parent> > > </Container> > > > > Got rid of the element...but not the value. So I tried the "deep-drop" > > described on that link: > > transformOutInterceptor.setOutTransformElements(Collections.singletonM > > ap("{ > > http://something}Child1", "")); > > > > Which resulted in: > > <Container xmlns="http://something"> > > <Parent/> > > </Container> > > > > What am I screwing up? I basically just want to end up with: > > <Container xmlns="http://something"> > > <Parent> > > <Child2>Another Value</Child2> > > <Child1>Some Value</Child1> > > </Parent> > > </Container> > > > > Many Thanks! > > Greg > > > > > > On Fri, May 24, 2013 at 3:36 AM, Sergey Beryozkin > > <[email protected]>wrote: > > > > > Hi > > > > > > On 23/05/13 22:02, Greg Barker wrote: > > > > > >> Hello - > > >> > > >> I'm using the Apache CXF WebClient for a project, and the REST API I > > >> am interacting with has a requirement that XML elements are sent in a > > >> specific order, and "correct" order can change depending on certain > > >> settings that are not known at compile time. > > >> > > >> I've found that the XmlType.propOrder annotation allows me to specify > > >> the order in which I want the XML elements to appear at compile time. > > >> This works great. The problem is that I need to be able to change > > >> this order at runtime, and I cannot figure out a way to do that > > >> without resorting to ugly/hacky solutions that modify the annotation > at > > runtime. > > >> > > >> Is there an easy way to specify XML element order dynamically at > > runtime? > > >> > > >> Try Transformation feature: > > > > > > http://cxf.apache.org/docs/**transformationfeature.html<http://cxf.apa > > > che.org/docs/transformationfeature.html> > > > > > > Use outDropElements and outAppendElements properties. > > > > > > Suppose you have the following produced by default: > > > <request> > > > <a/> > > > <b/> > > > </request> > > > > > > if needed, you can get <a/> dropped with outDropElements and then > > > added immediately after <b/> with outAppendElements. > > > > > > If that has to be set up dynamically then add the feature or its > > > interceptors from the code, similarly to > > > http://cxf.apache.org/docs/**transformationfeature.html#** > > > TransformationFeature- > > **Configuringthefeaturefromtheco**de<http://cxf. > > > apache.org/docs/transformationfeature.html#TransformationFeature- > > Confi > > > guringthefeaturefromthecode> > > > > > > HTH, Sergey > > > > > > Thanks! > > >> Greg > > >> > > >> > > > >
