/* * #%L * restdoc-plugin * %% * Copyright (C) 2012 IG Group * %% * 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. * #L% */ package com.iggroup.oss.restdoclet.plugin.util; import static org.apache.commons.lang.StringUtils.trimToNull; import static org.w3c.dom.Node.ELEMENT_NODE; import java.util.ArrayList; import java.util.Collection; import org.apache.commons.lang.StringUtils; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Contains utility-methods for reading XML. */ public final class XmlUtils { /** * No-argument constructor to "silence" PMD. */ private XmlUtils() { super(); } /** * Returns an attribute of a XML node. Leading and trailing whitespaces are * removed in the attribute. * * @param node the XML node. * @param name the name of the attribute. * @return the attribute or <code>null</code> if the attribute is not * present. */ public static String attribute(final Node node, final String name) { String value; if (node.getAttributes() == null) { value = null; } else { final Node attribute = node.getAttributes().getNamedItem(name); if (attribute == null) { value = null; } else { value = trimToNull(attribute.getNodeValue()); } } return value; } /** * Returns the <i>first</i> child-element of a XML node with a particular * name. * * @param node the XML node. * @param name the name of the child-element. * @return the child-element or <code>null</code> if no child with the name * was found. */ public static Element child(final Node node, final String name) { Element element = null; for (int i = 0; i < node.getChildNodes().getLength(); i++) { if (node.getChildNodes().item(i).getNodeType() == ELEMENT_NODE) { final Element child = (Element) node.getChildNodes().item(i); if (StringUtils.equals(name, child.getNodeName())) { element = child; break; } } } return element; } /** * Returns the child-elements of a XML node with a particular name. * * @param node the XML node. * @param name the name of the child-elements. * @return the collection of child-elements or an empty collection if no * children with the name were found. */ public static Collection<Element> children(final Node node, final String name) { final Collection<Element> elements = new ArrayList<Element>(); for (int i = 0; i < node.getChildNodes().getLength(); i++) { if (node.getChildNodes().item(i).getNodeType() == ELEMENT_NODE) { final Element child = (Element) node.getChildNodes().item(i); if (StringUtils.equals(name, child.getNodeName())) { elements.add(child); } } } return elements; } /** * Returns the test-content of a XML node. Leading and trailing whitespaces * are removed in the text. * * @param node the XML node. * @return the text-content or <code>null</code> if the node does not * contain any text. */ public static String textContext(final Node node) { String result; if (node.getFirstChild() == null) { result = null; } else { result = trimToNull(node.getFirstChild().getNodeValue()); } return result; } }