Hi Saliya Following shown my scenarios.
Scenario 1 - without detach on root element String str = "<hello><something>wow nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>"; XMLStreamReader parser = XMLInputFactory.newInstance(). createXMLStreamReader(new ByteArrayInputStream(str.getBytes())); StAXOMBuilder builder = new StAXOMBuilder(parser); OMElement root = builder.getDocumentElement(); *// root.detach();* AXIOMXPath xpath = new AXIOMXPath("//hello/something"); OMElement node = (OMElement) xpath.selectSingleNode(root); System.out.println(node == null); if (node != null) { System.out.println(node.getText()); } Out put : false * wow nice* Scenario 2 - with detach on root element String str = "<hello><something>wow nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>"; XMLStreamReader parser = XMLInputFactory.newInstance(). createXMLStreamReader(new ByteArrayInputStream(str.getBytes())); StAXOMBuilder builder = new StAXOMBuilder(parser); OMElement root = builder.getDocumentElement(); * root.detach();* AXIOMXPath xpath = new AXIOMXPath("//hello/something"); OMElement node = (OMElement) xpath.selectSingleNode(root); System.out.println(node == null); if (node != null) { System.out.println(node.getText()); } Output true In second case , XPath have not been evaluated correctly. Thanks Indika On Sat, Jun 20, 2009 at 9:40 PM, Saliya Ekanayake <esal...@gmail.com> wrote: > Hi, > > Um, I am not really clarified with the problem here. I agree that the full > tree should be built before we can evaluate XPath. Adding the element to a > new OMDocument, however, just to get this done seems not right. > Additionally, the original OMDocument created by the builder will be there > even if you detach the element. Detach will only remove the element from the > tree to which it belongs. To check this, you can get the builder from the > detached element and ask for the OMDocument. IMHO, we can call > result.build() if necessary. > > Btw. I am not clear why XPath doesn't work on the detached element. I did a > simple test as follows and XPath worked, may be I have missed something > (please let me know if so). > > public static void main(String[] args) throws XMLStreamException, > JaxenException { > String str = "<hello><something>wow > nice</something><anotherthing><insideanother>great</insideanother></anotherthing></hello>"; > StAXOMBuilder builder = new StAXOMBuilder(new > ByteArrayInputStream(str.getBytes())); > OMElement root = builder.getDocumentElement(); > > OMDocument doc = builder.getDocument(); > System.out.println(doc == null); > > OMElement anotherthing = root.getFirstChildWithName(new > QName("anotherthing")); > anotherthing.detach(); > > doc = ((StAXOMBuilder)anotherthing.getBuilder()).getDocument(); > System.out.println(doc == null); > > AXIOMXPath xpath = new AXIOMXPath("//insideanother"); > OMElement node = (OMElement) xpath.selectSingleNode(anotherthing); > System.out.println(node.getText()); > } > > Thanks, > Saliya > > On Sat, Jun 20, 2009 at 4:45 AM, Andreas Veithen < > andreas.veit...@gmail.com> wrote: > >> StAXOMBuilder actually already creates an OMDocument (which can be >> retrieved by the getDocument method). The important thing is that we >> need to make sure that the Axiom tree is fully built before closing >> the input stream. I guess that the detach method is used because it >> has the side effect of fully building the element and because >> OMDocument has no method to build the entire tree (see WSCOMMONS-479). >> >> This gives us two solutions: >> >> - Use StAXOMBuilder#getDocument and iterate over its children to make >> sure the document is fully built. >> - Continue to use "detach" and add the element to a new document, as >> you suggested. Note that you should not use OMDocumentImpl directly, >> but create it using the OMFactory. >> >> Andreas >> >> On Fri, Jun 19, 2009 at 09:30, indika kumara<indika.k...@gmail.com> >> wrote: >> > Devs >> > >> > $subject is due to we do 'detach()' on picked resource OMElement . >> > If I add detached element to a OMDocument as a child, it works >> > >> > Existing code SImpleURLRegistry >> > >> > result.detach(); >> > inputStream.close(); >> > >> > >> > Modified code >> > >> > result.detach(); >> > OMDocumentImpl omDocument = new OMDocumentImpl(); >> > omDocument.addChild(result); >> > inputStream.close(); >> > >> > >> > Are there any best solution other than what I did ? I haven't deep >> > AXIOM knowledge? Could anyone help me? >> > >> > Thanks >> > Indika >> > >> > --------------------------------------------------------------------- >> > To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org >> > For additional commands, e-mail: dev-h...@synapse.apache.org >> > >> > >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org >> For additional commands, e-mail: dev-h...@synapse.apache.org >> >> > > > -- > Saliya Ekanayake > http://www.esaliya.blogspot.com > http://www.esaliya.wordpress.com >