Coverage Report - com.jcabi.xml.XML
 
Classes in this File Line Coverage Branch Coverage Complexity
XML
N/A
N/A
1
 
 1  
 /**
 2  
  * Copyright (c) 2012-2017, jcabi.com
 3  
  * All rights reserved.
 4  
  *
 5  
  * Redistribution and use in source and binary forms, with or without
 6  
  * modification, are permitted provided that the following conditions
 7  
  * are met: 1) Redistributions of source code must retain the above
 8  
  * copyright notice, this list of conditions and the following
 9  
  * disclaimer. 2) Redistributions in binary form must reproduce the above
 10  
  * copyright notice, this list of conditions and the following
 11  
  * disclaimer in the documentation and/or other materials provided
 12  
  * with the distribution. 3) Neither the name of the jcabi.com nor
 13  
  * the names of its contributors may be used to endorse or promote
 14  
  * products derived from this software without specific prior written
 15  
  * permission.
 16  
  *
 17  
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 18  
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
 19  
  * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 20  
  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 21  
  * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 22  
  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 23  
  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 24  
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 25  
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 26  
  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 27  
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 28  
  * OF THE POSSIBILITY OF SUCH DAMAGE.
 29  
  */
 30  
 package com.jcabi.xml;
 31  
 
 32  
 import java.util.List;
 33  
 import javax.xml.namespace.NamespaceContext;
 34  
 import org.w3c.dom.Node;
 35  
 
 36  
 /**
 37  
  * XML document.
 38  
  *
 39  
  * <p>Set of convenient XML manipulations:
 40  
  *
 41  
  * <pre> XML xml = new XMLDocument(content);
 42  
  * for (XML employee : xml.nodes("//Employee")) {
 43  
  *   String name = employee.xpath("name/text()").get(0);
 44  
  *   // ...
 45  
  * }</pre>
 46  
  *
 47  
  * <p>You can always get DOM node out of this abstraction using {@link #node()}
 48  
  * method.
 49  
  *
 50  
  * <p>{@code toString()} must produce a full XML.
 51  
  *
 52  
  * <p>Implementation of this interface must be immutable and thread-safe.
 53  
  *
 54  
  * @author Yegor Bugayenko (yegor@teamed.io)
 55  
  * @version $Id: 9c5cd6f62a238f8950351c045fa42b34a93044e0 $
 56  
  * @since 0.1
 57  
  * @see XMLDocument
 58  
  */
 59  
 public interface XML {
 60  
 
 61  
     /**
 62  
      * Find and return text elements or attributes matched by XPath address.
 63  
      *
 64  
      * <p>The XPath query should point to text elements or attributes in the
 65  
      * XML document. If any nodes of different types (elements, comments, etc.)
 66  
      * are found in result node list -
 67  
      * a {@link RuntimeException} will be thrown.
 68  
      *
 69  
      * <p>Alternatively, the XPath query can be a function or expression that
 70  
      * returns a single value instead of pointing to a set of nodes. In this
 71  
      * case, the result will be a List containing a single String, the content
 72  
      * of which is the result of the evaluation. If the expression result is not
 73  
      * a String, it will be converted to a String representation and returned as
 74  
      * such. For example, a document containing three &lt;a&gt; elements,
 75  
      * the input query "count(//a)", will return a singleton List with a single
 76  
      * string value "3".
 77  
      *
 78  
      * <p>This is a convenient method, which is used (according to our
 79  
      * experience) in 95% of all cases. Usually you don't need to get anything
 80  
      * else but a text value of some node or an attribute. And in most cases
 81  
      * you are interested to get just the first value
 82  
      * (use {@code xpath(..).get(0)}). But when/if you need to get more than
 83  
      * just a plain text - use {@link #nodes(String)}.
 84  
      *
 85  
      * <p>The {@link List} returned will throw {@link IndexOutOfBoundsException}
 86  
      * if you try to access a node which wasn't found by this XPath query.
 87  
      *
 88  
      * <p>An {@link IllegalArgumentException} is thrown if the parameter
 89  
      * passed is not a valid XPath expression.
 90  
      *
 91  
      * @param query The XPath query
 92  
      * @return The list of string values (texts) or single function result
 93  
      */
 94  
     List<String> xpath(String query);
 95  
 
 96  
     /**
 97  
      * Retrieve DOM nodes from the XML response.
 98  
      *
 99  
      * <p>The {@link List} returned will throw {@link IndexOutOfBoundsException}
 100  
      * if you try to access a node which wasn't found by this XPath query.
 101  
      *
 102  
      * <p>An {@link IllegalArgumentException} is thrown if the parameter
 103  
      * passed is not a valid XPath expression.
 104  
      *
 105  
      * @param query The XPath query
 106  
      * @return Collection of DOM nodes
 107  
      */
 108  
     List<XML> nodes(String query);
 109  
 
 110  
     /**
 111  
      * Register additional namespace prefix for XPath.
 112  
      *
 113  
      * <p>For example:
 114  
      *
 115  
      * <pre>
 116  
      * String name = new XMLDocument("...")
 117  
      *   .registerNs("ns1", "http://example.com")
 118  
      *   .registerNs("foo", "http://example.com/foo")
 119  
      *   .xpath("/ns1:root/foo:name/text()")
 120  
      *   .get(0);
 121  
      * </pre>
 122  
      *
 123  
      * <p>A number of standard namespaces are registered by default in
 124  
      * instances of XML. Their
 125  
      * full list is in {@link XMLDocument#XMLDocument(String)}.
 126  
      *
 127  
      * <p>If a namespace prefix is already registered an
 128  
      * {@link IllegalArgumentException} will be thrown.
 129  
      *
 130  
      * @param prefix The XPath prefix to register
 131  
      * @param uri Namespace URI
 132  
      * @return A new XML document, with this additional namespace registered
 133  
      */
 134  
     XML registerNs(String prefix, Object uri);
 135  
 
 136  
     /**
 137  
      * Append this namespace context to the existing one.
 138  
      *
 139  
      * <p>The existing context (inside this object) and the new one provided
 140  
      * will be merged together. The existing context will be have higher
 141  
      * priority.
 142  
      *
 143  
      * @param context The context to append
 144  
      * @return A new XML document, with a merged context on board
 145  
      */
 146  
     XML merge(NamespaceContext context);
 147  
 
 148  
     /**
 149  
      * Retrieve DOM node, represented by this wrapper.
 150  
      * @return DOM node
 151  
      */
 152  
     Node node();
 153  
 
 154  
 }