Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2003-2007 the original author or authors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package groovy.util;
 
 
 import java.io.File;
 import java.io.Reader;
 import java.net.URL;
 import java.util.Map;
 
 

Author(s):
John Wilson
 
 
 public class XmlSlurper extends DefaultHandler {
   private final XMLReader reader;
   private Node currentNode = null;
   private final Stack stack = new Stack();
   private final StringBuffer charBuffer = new StringBuffer();
   private final Map namespaceTagHints = new Hashtable();
   private boolean keepWhitespace = false;
 
     this(falsetrue);
   }
   
   public XmlSlurper(final boolean validatingfinal boolean namespaceAwarethrows ParserConfigurationExceptionSAXException {
     SAXParserFactory factory = FactorySupport.createSaxParserFactory();
     factory.setNamespaceAware(namespaceAware);
     factory.setValidating(validating);
     this. = factory.newSAXParser().getXMLReader();
   }
   
   public XmlSlurper(final XMLReader reader) {
     this. = reader;
   }
   
   public XmlSlurper(final SAXParser parserthrows SAXException {
     this(parser.getXMLReader());
   }
  
  

Parameters:
keepWhitespace If true then whitespace before elements is kept. The default is to discard the whitespace.
 
   public void setKeepWhitespace(boolean keepWhitespace) {
       this. = keepWhitespace;
   }
  
  

Returns:
The GPathResult instance created by consuming a stream of SAX events Note if one of the parse methods has been called then this returns null Note if this is called more than once all calls after the first will return null
 
   public GPathResult getDocument() {
    try {
      return new NodeChild(this.nullthis.);
    } finally {
      this. = null;
    }
  }
  
  
Parse the content of the specified input source into a GPathResult object

Parameters:
input
Returns:
An object which supports GPath expressions
Throws:
java.io.IOException
org.xml.sax.SAXException
  public GPathResult parse(final InputSource inputthrows IOExceptionSAXException {
    this..setContentHandler(this);
    this..parse(input);
    
    return getDocument();
    
  }
  
  
Parses the content of the given file as XML turning it into a GPathResult object

Parameters:
file
Returns:
An object which supports GPath expressions
Throws:
java.io.IOException
org.xml.sax.SAXException
  public GPathResult parse(final File filethrows IOExceptionSAXException {
  final InputSource input = new InputSource(new FileInputStream(file));
    
    input.setSystemId("file://" + file.getAbsolutePath());
    
    return parse(input);
    
  }
  
  
Parse the content of the specified input stream into an GPathResult Object. Note that using this method will not provide the parser with any URI for which to find DTDs etc

Parameters:
input
Returns:
An object which supports GPath expressions
Throws:
java.io.IOException
org.xml.sax.SAXException
  public GPathResult parse(final InputStream inputthrows IOExceptionSAXException {
    return parse(new InputSource(input));
  }
  
  
Parse the content of the specified reader into a GPathResult Object. Note that using this method will not provide the parser with any URI for which to find DTDs etc

Parameters:
in
Returns:
An object which supports GPath expressions
Throws:
java.io.IOException
org.xml.sax.SAXException
  public GPathResult parse(final Reader inthrows IOExceptionSAXException {
    return parse(new InputSource(in));
  }
  
  
Parse the content of the specified URI into a GPathResult Object

Parameters:
uri
Returns:
An object which supports GPath expressions
Throws:
java.io.IOException
org.xml.sax.SAXException
  public GPathResult parse(final String urithrows IOExceptionSAXException {
    return parse(new InputSource(uri));
  }
  
  
A helper method to parse the given text as XML

Parameters:
text
Returns:
An object which supports GPath expressions
  public GPathResult parseText(final String textthrows IOExceptionSAXException {
    return parse(new StringReader(text));
  }
  
  // Delegated XMLReader methods
  //------------------------------------------------------------------------
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#getDTDHandler()
   */
  public DTDHandler getDTDHandler() {
      return this..getDTDHandler();
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#getEntityResolver()
   */
      return this..getEntityResolver();
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#getErrorHandler()
   */
      return this..getErrorHandler();
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#getFeature(java.lang.String)
   */
  public boolean getFeature(final String urithrows SAXNotRecognizedExceptionSAXNotSupportedException {
      return this..getFeature(uri);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#getProperty(java.lang.String)
   */
      return this..getProperty(uri);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#setDTDHandler(org.xml.sax.DTDHandler)
   */
  public void setDTDHandler(final DTDHandler dtdHandler) {
      this..setDTDHandler(dtdHandler);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#setEntityResolver(org.xml.sax.EntityResolver)
   */
  public void setEntityResolver(final EntityResolver entityResolver) {
      this..setEntityResolver(entityResolver);
  }

  
Resolves entities against using the suppied URL as the base for relative URLs

Parameters:
base The URL used to resolve relative URLs
  public void setEntityBaseUrl(final URL base) {
      this..setEntityResolver(new EntityResolver() {
          public InputSource resolveEntity(final String publicIdfinal String systemIdthrows IOException {
              return new InputSource(new URL(basesystemId).openStream());
          }
      });
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
   */
  public void setErrorHandler(final ErrorHandler errorHandler) {
      this..setErrorHandler(errorHandler);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#setFeature(java.lang.String, boolean)
   */
  public void setFeature(final String urifinal boolean valuethrows SAXNotRecognizedExceptionSAXNotSupportedException {
      this..setFeature(urivalue);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.XMLReader#setProperty(java.lang.String, java.lang.Object)
   */
  public void setProperty(final String urifinal Object valuethrows SAXNotRecognizedExceptionSAXNotSupportedException {
       this..setProperty(urivalue);
  }
  
  
  // ContentHandler interface
  //-------------------------------------------------------------------------                    
  
  /* (non-Javadoc)
   * @see org.xml.sax.ContentHandler#startDocument()
   */
  public void startDocument() throws SAXException {
    this. = null;
    this..setLength(0);
  }
  
  /* (non-Javadoc)
   * @see org.xml.sax.helpers.DefaultHandler#startPrefixMapping(java.lang.String, java.lang.String)
   */
  public void startPrefixMapping(final String tagfinal String urithrows SAXException {
    this..put(taguri);
  }
  /* (non-Javadoc)
   * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
   */
  public void startElement(final String namespaceURIfinal String localNamefinal String qNamefinal Attributes attsthrows SAXException {
    addCdata();
    
    final Map attributes = new HashMap();
    final Map attributeNamespaces = new HashMap();
    
    for (int i = atts.getLength() - 1; i != -1; i--) {
      if (atts.getURI(i).length() == 0) {
        attributes.put(atts.getQName(i), atts.getValue(i));
      } else {
        attributes.put(atts.getLocalName(i), atts.getValue(i));
        attributeNamespaces.put(atts.getLocalName(i), atts.getURI(i));
      }
      
    }
    
    final Node newElement;
    
    if (namespaceURI.length() == 0){
      newElement = new Node(this.qNameattributesattributeNamespacesnamespaceURI);
    } else {
      newElement = new Node(this.localNameattributesattributeNamespacesnamespaceURI);
    }
    
    if (this. != null) {
      this..addChild(newElement);
    }
    
    this..push(this.);
    this. = newElement;
  }
  
  /* (non-Javadoc)
   * @see org.xml.sax.ContentHandler#characters(char[], int, int)
   */
  public void characters(final char[] chfinal int startfinal int lengththrows SAXException {
    this..append(chstartlength);
  }
  
  /* (non-Javadoc)
   * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
   */
  public void endElement(final String namespaceURIfinal String localNamefinal String qNamethrows SAXException {
    addCdata();
    
    final Object oldCurrentNode = this..pop();
    
    if (oldCurrentNode != null) {
      this. = (Node)oldCurrentNode;
    }
  }
  
  /* (non-Javadoc)
   * @see org.xml.sax.ContentHandler#endDocument()
   */
  public void endDocument() throws SAXException {
  }
  
  // Implementation methods
  //-------------------------------------------------------------------------           
  
  
  private void addCdata() {
    if (this..length() != 0) {
      //
      // This element is preceeded by CDATA if keepWhitespace is false (the default setting) and 
      // it's not whitespace add it to the body
      // Note that, according to the XML spec, we should preserve the CDATA if it's all whitespace
      // but for the sort of work I'm doing ignoring the whitespace is preferable
      //
      final String cdata = this..toString();
      
      this..setLength(0);
      if (this. || cdata.trim().length() != 0) {
        this..addChild(cdata);
      }
    }   
  }
New to GrepCode? Check out our FAQ X