Main.java Source code

Java tutorial

Introduction

Here is the source code for Main.java

Source

//package com.java2s;
/*---------------------------------------------------------------
 *  Copyright 2005 by the Radiological Society of North America
 *
 *  This source software is released under the terms of the
 *  RSNA Public License (http://mirc.rsna.org/rsnapubliclicense)
 *----------------------------------------------------------------*/

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main {
    /**
     * Get the value of a node specified by a starting node and a
     * path string. If the starting node is a Document, use the
     * document element as the starting point.
     * <ul>
     * <li>A path to an element has the form: elem1/.../elemN
     * <li>A path to an attribute has the form: elem1/.../elemN@attr
     * </ul>
     * The value of an element node is the sum of all the element's
     * first generation child text nodes. Note that this is not what you
     * would get from a mixed element in an XSL program.
     * @param node the top of the tree to search.
     * @param path the path from the top of the tree to the desired node.
     * @return the value of the first node matching the path, or the
     * empty string if no node exists at the path location or if the
     * starting node is not an element.
     */
    public static String getValueViaPath(Node node, String path) {
        if (node instanceof Document)
            node = ((Document) node).getDocumentElement();
        if (!(node instanceof Element))
            return "";
        path = path.trim();
        int kAtsign = path.indexOf("@");

        //If the target is an element, get the element's value.
        if (kAtsign == -1) {
            Element target = getElementViaPath(node, path);
            if (target == null)
                return "";
            return target.getTextContent();
        }

        //The target is an attribute; first find the element.
        String subpath = path.substring(0, kAtsign);
        Element target = getElementViaPath(node, subpath);
        if (target == null)
            return null;
        String name = path.substring(kAtsign + 1);
        return target.getAttribute(name);
    }

    /**
     * Get an element specified by a starting node and a path string.
     * If the starting node is a Document, use the document element
     * as the starting point.
     * <ul><li>A path to an element has the form: elem1/.../elemN</ul>
     * @param node the top of the tree to search.
     * @param path the path from the top of the tree to the desired element.
     * @return the first element matching the path, or null if no element
     * exists at the path location or if the starting node is not an element.
     */
    public static Element getElementViaPath(Node node, String path) {
        if (node instanceof Document)
            node = ((Document) node).getDocumentElement();
        if (!(node instanceof Element))
            return null;
        int k = path.indexOf("/");
        String firstPathElement = path;
        if (k > 0)
            firstPathElement = path.substring(0, k);
        if (node.getNodeName().equals(firstPathElement)) {
            if (k < 0)
                return (Element) node;
            path = path.substring(k + 1);
            NodeList nodeList = ((Element) node).getChildNodes();
            Node n;
            for (int i = 0; i < nodeList.getLength(); i++) {
                n = nodeList.item(i);
                if ((n instanceof Element) && ((n = getElementViaPath(n, path)) != null))
                    return (Element) n;
            }
        }
        return null;
    }

    /**
     * Get the text content of an element identified by a path,
     * where the path elements can include an index. The first
     * path element must not have an index, and its name must
     * match the name of the starting node. If the starting
     * node is a Document, the root Element of the document is
     * used as the starting point. Path elements must be separated
     * by the slash character. If the path starts with a slash,
     * the slash is ignored. If the element or attribute identified
     * by the path is not present as a child of the starting node,
     * the empty string is returned. If a path element identifies
     * an attribute, any subsequent path elements are ignored.
     * A path is in the form: /e1/e2/e3/... or /e1/e2/@attr
     * Note the slash preceding the attribute's @-sign.
     * @param node the starting node for the path. The first path
     * element must match the name of this node.
     * @param path the path to the target node.
     * @return the full text value of the target node (including all
     * descendent text nodes), or the empty string if the target is
     * not a descendent of the starting node.
     */
    public static String getTextContent(Node node, String path) {
        if (node instanceof Document)
            node = ((Document) node).getDocumentElement();
        if (!(node instanceof Element))
            return "";
        Element el = (Element) node;
        path = path.replaceAll("\\s", "");
        if (path.startsWith("/"))
            path = path.substring(1);
        String[] pathElements = path.split("/");
        if (!pathElements[0].equals(el.getTagName()))
            return "";
        for (int i = 1; i < pathElements.length; i++) {
            String pe = pathElements[i];
            if (pe.startsWith("@")) {
                //If this path element identifies an attribute, return it
                //and ignore any further path elements.
                return el.getAttribute(pe.substring(1));
            } else {
                //This path element identifies an Element. It may have an index.
                //Get the index, if present, and get the element name.
                int n = 0;
                int k = pe.indexOf("[");
                int kk = pe.lastIndexOf("]");
                if ((k != -1) && (k < kk)) {
                    try {
                        n = Integer.parseInt(pe.substring(k + 1, kk));
                    } catch (Exception ex) {
                        return "";
                    }
                    pe = pe.substring(0, k);
                } else if (k != kk)
                    return "";
                //We now have the element name and the index.
                //Find the identified Element. We have to count
                //matching elements to find the one identified
                //by the index.
                int nn = 0;
                Node child = el.getFirstChild();
                while (child != null) {
                    if ((child.getNodeType() == Node.ELEMENT_NODE) && child.getNodeName().equals(pe)) {
                        if (n == nn)
                            break;
                        nn++;
                    }
                    child = child.getNextSibling();
                }
                //If the child is null, we didn't find the identified Element.
                if (child == null)
                    return "";
                //If we get here, we found it, now look for the next one.
                el = (Element) child;
            }
        }
        //Okay, we must be at the end of the path, and it must be an Element.
        //Return the text content of the element.
        return el.getTextContent();
    }
}