Hi Eugen,

we use xml beans within streaming xml processing and had a similar problem.
The helper class simply throws away the elements until it reads the given tag.
When its on the element, the xml will be copied into a stringbuffer which
can be then parsed by your xml bean.
For stream processing we are using woodstox.
(I hope there are not to many errors into following code as I only adapted it
straight from our sources without testing ...)

Best wishes,
Andreas.



XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
StringWriter sw = new StringWriter();

XmlOptions xo = new XmlOptions();
xo.setLoadStripWhitespace();
xo.setValidateTreatLaxAsSkip();
xo.setSaveOuter();
ArrayList validationErrors = new ArrayList();
xo.setErrorListener(validationErrors);

XMLEventReader xmlReader = xmlInputFactory.createXMLEventReader(<your 
inputstream>);
XMLEventWriter xmlWriter = xmlOutputFactory.createXMLEventWriter(sw);


// skip pragma/prefix
StaxHelper.readUntilElement(xmlReader, xmlWriter, "ProjectDataSet");

// read element
StaxHelper.readElement(xmlReader, xmlWriter, sw, "ProjectDataSet");

ParentOfProjectDataSetType popdst = 
ParentOfProjectDataSetType.Factory.parse(sw.toString(), xo);
ProjectDataSetType pdst = popdst.getProjectDataSet();





public class StaxHelper {
        public static XMLEvent readUntilElement(XMLEventReader xmlReader, 
XMLEventWriter xmlWriter, String name)
                throws XMLStreamException, NpsAppError {
                XMLEvent event = null;

                for (boolean isFirstElement = true; xmlReader.hasNext(); 
isFirstElement = false) {
                        event = xmlReader.peek();
                        if (event.isStartElement()) {
                                if (!isFirstElement && 
name.equals(((StartElement)event).getName().getLocalPart())) {
                                        if (xmlWriter != null) 
xmlWriter.flush();
                                        return event;
                                }
                        }
                        event = xmlReader.nextEvent();
                        if (xmlWriter != null) xmlWriter.add(event);
                        if (event.isEndElement() && 
name.equals(((EndElement)event).getName().getLocalPart())) {
                                if (xmlWriter != null) xmlWriter.flush();
                                return event;
                        }
                }

                // throws exception after last element
                throw new NpsAppError(
                        NpsErrorConst.ERROR_ELEMENT_NOT_FOUND,
                        NpsErrorConst.XML_SUBSYSTEM,
                        name);
        }

        public static void readElement(XMLEventReader xmlReader, XMLEventWriter 
xmlWriter, StringWriter sw, String name)
        throws XMLStreamException, NpsAppError {
                StringBuffer sb = sw.getBuffer();

                XMLEvent evt = xmlReader.peek();
                boolean isAtElement = (evt.isStartElement() && 
name.equals(((StartElement)evt).getName().getLocalPart()));

                if (!isAtElement) {
                        readUntilElement(xmlReader, xmlWriter, name); /* search 
start */
                }
                xmlWriter.flush();
                sb.setLength(0);

                readUntilElement(xmlReader, xmlWriter, name); /* search end */
                xmlWriter.flush();

                int startTagIdx = sb.indexOf("<");
                if (startTagIdx > 0) sb.delete(0, startTagIdx);
        }
}




-----Ursprüngliche Nachricht-----
Von: Eugen Okon [mailto:[email protected]]
Gesendet: Dienstag, 16. Dezember 2008 16:21
An: [email protected]
Betreff: Re: parse a part of xml

Hi Andy,

my interactions with the web service are limited to very basic operations, so i 
do not use any special framework ecxept apache commons. I get the response as 
an InputStream. Thats the reason i am search for a way to skip a part of the 
response. Even in the case i could get just the body of the soap message there 
would be some "pre-"tags generated by the Microsoft Project Web Service which i 
do not want to model as java objects. i have seen that the parse method has an 
additional parameter : XMLOptions, but i can't find out whether its helpfull 
for my aim or not.  There should be a possibility to tell the parse which node 
shoult be treated as root - or not? I have search for similar problems in the 
mailinglist but i can't find anything. I think there should be more users which 
need this functionality or is my approach just wrong :)?
-------- Original-Nachricht --------
> Datum: Tue, 16 Dec 2008 08:59:41 -0600
> Von: Andy Putnins <[email protected]>
> An: [email protected]
> Betreff: Re: parse a part of xml

> How are you handing the SOAP protocol messages? I have done this in the
> past by utilizing AXIS
> running in a Tomcat container to decode the SOAP messages. AXIS includes a
> wsdl2java utility
> to generate server-side stubs and implementation classes. Then you can use
> XMLBeans to process the
> contents of the SOAP messages.
>
>       - Andy
>
> On Tue, 16 Dec 2008 08:55:15 +0100  "Eugen Okon" wrote:
>  > Hi Jacob,
>  > thanks a lot for your answer!
>  > There is no problem to get the values of the projectdataset, in the
> case that i copy/p
>      aste the
>  > <ProjectDataSet>
>  >                        Information I need!!!!
>  > </ProjectDataSet>
>  > part to a new file and use it. The exception is caused (in my opinion)
> because the roo
>      t element of the doc i am trying to parse is <soap:envelope> and not
> <ProjectDataSet
>      >. What i am searching for is a possibility to tell the parser to
> skip all tags till
>       <ProjectDataSet>. The Exception i get is:
>  >
>  > error: The document is not a
> projectdata...@http://schemas.microsoft.com/office/projec
>      t/server/webservices/ProjectDataSet/: document element mismatch got
> envel...@http://
>      schemas.xmlsoap.org/soap/envelope/
>  >    at
> org.apache.xmlbeans.impl.store.Locale.verifyDocumentType(Locale.java:458)
>  >    at
> org.apache.xmlbeans.impl.store.Locale.autoTypeDocument(Locale.java:363)
>  >
>  > with best regards
>  > Eugen
>  > -------- Original-Nachricht --------
>  > > Datum: Mon, 15 Dec 2008 09:15:22 -0800
>  > > Von: "Jacob Danner" <[email protected]>
>  > > An: [email protected]
>  > > Betreff: Re: parse a part of xml
>  >
>  > > Hi Eugen,
>  > > Are you having troubles getting the value of the projectdataset
>  > > element or are you just getting an exception when you are trying to
>  > > parse it?
>  > > Is there a projectDatasetType Class available? Have you tried that?
>  > > What is the exception you are seeing?
>  > > -jacobd
>  > >
>  > > On Mon, Dec 15, 2008 at 1:41 AM, Eugen Okon <[email protected]> wrote:
>  > > > Hello,
>  > > > i am new to xmlbeans, so maybe my question is a kind of "basics"
> for the
>  > > framework. I am writing an application which communicates with Ms
> Project
>  > > PSI Web Services. The application gets a SOAP response from Ms
> Project. The
>  > > structure of this response is described below:
>  > > >
>  > > > <soap:envelope>
>  > > > …..
>  > > > <soap:body>
>  > > > <ReadProjectResponse>
>  > > >        …
>  > > >                <ProjectDataSet>
>  > > >                        Information I need!!!!
>  > > > </ProjectDataSet>
>  > > >        …
>  > > > <ReadProjectResponse>
>  > > > </soap:body>
>  > > > </soap:envelope>
>  > > >
>  > > > Ok so now I can finally describe the problem. I have a xsd schema
> which
>  > > models the structure of <ProjectDataSet>. From these xsd I've
> generated
>  > > java code with xmlbeans's ant task. Now I am searching for an elegant
>  > > possibility to parse this kind of responses. This means
>  > > ProjectDataSetDocument.Factory.parse(is); should parse the
> inputstream beginning wit
>      h the
>  > > <ProjectDataSet>. In other cases I am understandably getting an
> exception. I hope
>  > > someone can help me solving this problem.
>  > > >
>  > > > Eugen
>  > > >
>  > > > --
>  > > > Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit
>  > > allen: http://www.gmx.net/de/go/multimessenger
>  > > >
>  > > >
> ---------------------------------------------------------------------
>  > > > To unsubscribe, e-mail: [email protected]
>  > > > For additional commands, e-mail: [email protected]
>  > > >
>  > > >
>  > >
>  > > ---------------------------------------------------------------------
>  > > To unsubscribe, e-mail: [email protected]
>  > > For additional commands, e-mail: [email protected]
>  >
>  > --
>  > Sensationsangebot verlängert: GMX FreeDSL - Telefonanschluss + DSL
>  > für nur 16,37 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K1308T4569a
>  >
>  > ---------------------------------------------------------------------
>  > To unsubscribe, e-mail: [email protected]
>  > For additional commands, e-mail: [email protected]
>  >
>
>       - Andy
> ________________________________________________________________
> Andris Putnins, Principal
> Lett Engineering              phone:  (847) 997-0002
> 300 Bramble Lane              fax:    (847) 550-0633
> Deer Park, IL 60011           email:  [email protected]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]

--
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: 
http://www.gmx.net/de/go/multimessenger

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to