⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmloptions.java

📁 代码是一个分类器的实现,其中使用了部分weka的源代码。可以将项目导入eclipse运行
💻 JAVA
字号:
/* *    This program is free software; you can redistribute it and/or modify *    it under the terms of the GNU General Public License as published by *    the Free Software Foundation; either version 2 of the License, or *    (at your option) any later version. * *    This program is distributed in the hope that it will be useful, *    but WITHOUT ANY WARRANTY; without even the implied warranty of *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *    GNU General Public License for more details. * *    You should have received a copy of the GNU General Public License *    along with this program; if not, write to the Free Software *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* * XMLOptions.java * Copyright (C) 2004 University of Waikato, Hamilton, New Zealand * */package weka.core.xml;import java.io.File;import java.io.InputStream;import java.io.Reader;import java.util.Vector;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/** * A class for transforming options listed in XML to a regular WEKA command * line string.<p> * * @author FracPete (fracpete at waikato dot ac dot nz) * @version $Revision: 1.2 $ */public class XMLOptions {   /** tag for a single option */   public final static String TAG_OPTION = "option";   /** tag for a list of options */   public final static String TAG_OPTIONS = "options";      /** the name attribute */   public final static String ATT_NAME = "name";      /** the type attribute */   public final static String ATT_TYPE = "type";      /** the value attribute */   public final static String ATT_VALUE = "value";      /** a value of the type attribute */   public final static String VAL_TYPE_FLAG = "flag";      /** a value of the type attribute */   public final static String VAL_TYPE_SINGLE = "single";      /** a value of the type attribute */   public final static String VAL_TYPE_HYPHENS = "hyphens";      /** a value of the type attribute */   public final static String VAL_TYPE_QUOTES = "quotes";      /** a value of the type attribute */   public final static String VAL_TYPE_CLASSIFIER = "classifier";   /** the root node */   public final static String ROOT_NODE = TAG_OPTIONS;      /** the DTD for the XML file */   public final static String DOCTYPE =         "<!DOCTYPE " + ROOT_NODE + "\n"      + "[\n"      + "   <!ELEMENT " + TAG_OPTIONS + " (" + TAG_OPTION + ")*>\n"      + "   <!ATTLIST " + TAG_OPTIONS + " " + ATT_TYPE + " CDATA \"classifier\">\n"      + "   <!ATTLIST " + TAG_OPTIONS + " " + ATT_VALUE + " CDATA \"\">\n"      + "   <!ELEMENT " + TAG_OPTION + " (#PCDATA | " + TAG_OPTIONS + ")*>\n"      + "   <!ATTLIST " + TAG_OPTION + " " + ATT_NAME + " CDATA #REQUIRED>\n"      + "   <!ATTLIST " + TAG_OPTION + " " + ATT_TYPE + " (flag | single | hyphens | quotes) \"single\">\n"      + "]\n"      + ">";   /** the XML document */   protected XMLDocument m_XMLDocument = null;      /**     * Creates a new instance of XMLOptions     * @throws Exception if the construction of the DocumentBuilder fails    * @see #setValidating(boolean)    */   public XMLOptions() throws Exception {      m_XMLDocument = new XMLDocument();       m_XMLDocument.setRootNode(ROOT_NODE);      m_XMLDocument.setDocType(DOCTYPE);      setValidating(true);   }      /**     * Creates a new instance of XMLOptions     * @param xml the xml to parse (if "<?xml" is not found then it is considered a file)    * @throws Exception if the construction of the DocumentBuilder fails    * @see #setValidating(boolean)    */   public XMLOptions(String xml) throws Exception {      this();      getXMLDocument().read(xml);   }      /**     * Creates a new instance of XMLOptions     * @param file the XML file to parse    * @throws Exception if the construction of the DocumentBuilder fails    * @see #setValidating(boolean)    */   public XMLOptions(File file) throws Exception {      this();      getXMLDocument().read(file);   }      /**     * Creates a new instance of XMLOptions     * @param stream the XML stream to parse    * @throws Exception if the construction of the DocumentBuilder fails    * @see #setValidating(boolean)    */   public XMLOptions(InputStream stream) throws Exception {      this();      getXMLDocument().read(stream);   }      /**     * Creates a new instance of XMLOptions     * @param reader the XML reader to parse    * @throws Exception if the construction of the DocumentBuilder fails    * @see #setValidating(boolean)    */   public XMLOptions(Reader reader) throws Exception {      this();      getXMLDocument().read(reader);   }      /**    * returns whether a validating parser is used    * @return whether a validating parser is used    */   public boolean getValidating() {      return m_XMLDocument.getValidating();   }      /**    * sets whether to use a validating parser or not. <br>    * Note: this does clear the current DOM document!     * @param validating whether to use a validating parser    * @throws Exception if the instantiating of the DocumentBuilder fails    */   public void setValidating(boolean validating) throws Exception {       m_XMLDocument.setValidating(validating);   }      /**    * returns the parsed DOM document    * @return the parsed DOM document    */   public Document getDocument() {      return fixHyphens(m_XMLDocument.getDocument());   }      /**    * returns the handler of the XML document. the internal DOM document can     * be accessed via the <code>getDocument()</code> method.    * @return the object handling the XML document    * @see #getDocument()    */   public XMLDocument getXMLDocument() {       return m_XMLDocument;   }      /**    * pushes any options with type ATT_HYPHENS to the end, s.t. the "--" are    * really added at the end    * @param document the DOM document to work on    * @return the fixed DOM document    */   protected Document fixHyphens(Document document) {      NodeList          list;      Vector            hyphens;      int               i;      Node              node;      Node              tmpNode;      boolean           isLast;            // get all option tags      list = document.getDocumentElement().getElementsByTagName(TAG_OPTION);            // get all hyphen tags      hyphens = new Vector();      for (i = 0; i < list.getLength(); i++) {         if (((Element) list.item(i)).getAttribute(ATT_TYPE).equals(VAL_TYPE_HYPHENS))            hyphens.add(list.item(i));      }            // check all hyphen tags whether they are the end, if not fix it      for (i = 0; i < hyphens.size(); i++) {         node = (Node) hyphens.get(i);                  // at the end?         isLast  = true;         tmpNode = node;         while (tmpNode.getNextSibling() != null) {            // normal tag?            if (tmpNode.getNextSibling().getNodeType() == Node.ELEMENT_NODE) {               isLast = false;               break;            }            tmpNode = tmpNode.getNextSibling();         }                  // move         if (!isLast) {            tmpNode = node.getParentNode();            tmpNode.removeChild(node);            tmpNode.appendChild(node);         }      }            return document;   }      /**    * returns the quotes level for the given node, i.e. it returns the number     * of option's of the type "quotes" are in the path    */   protected int getQuotesLevel(Node node) {      int         result;            result = 0;      while (node.getParentNode() != null) {         if (!(node instanceof Element))            continue;                  // option-tag?         if (node.getNodeName().equals(TAG_OPTION)) {            // types = quotes?            if (((Element) node).getAttribute(ATT_TYPE).equals(VAL_TYPE_QUOTES))               result++;         }         node = node.getParentNode();      }            return result;   }      /**    * converts the given node into a command line representation and adds it    * to the existing command line    * @param cl the command line so far    * @param parent the node to convert to command line    * @param depth the current depth    * @return the new command line    */   protected String toCommandLine(String cl, Element parent, int depth) {      String            newCl;      String            tmpCl;      int               i;      Vector            list;      Vector            subList;      NodeList          subNodeList;      Element           node;            newCl = "";      // options      if (parent.getNodeName().equals(TAG_OPTIONS)) {         // classifier? -> add         if (parent.getAttribute(ATT_TYPE).equals(VAL_TYPE_CLASSIFIER)) {            newCl += parent.getAttribute(ATT_VALUE);         }                  // process children         list = XMLDocument.getChildTags(parent);         for (i = 0; i < list.size(); i++)            newCl = toCommandLine(newCl, (Element) list.get(i), depth + 1);      }      else      // option      if (parent.getNodeName().equals(TAG_OPTION)) {         newCl       += " -" +  parent.getAttribute(ATT_NAME);         subList      = XMLDocument.getChildTags(parent);         subNodeList  = parent.getChildNodes();         if (parent.getAttribute(ATT_TYPE).equals(VAL_TYPE_SINGLE)) {            if ( (subNodeList.getLength() > 0) && (!subNodeList.item(0).getNodeValue().trim().equals("")) )               newCl += " " + subNodeList.item(0).getNodeValue().trim();         }         else         if (parent.getAttribute(ATT_TYPE).equals(VAL_TYPE_HYPHENS)) {            newCl   += " " + ((Element) subList.get(0)).getAttribute(ATT_VALUE);  // expects classifier            // get single options in this node            subList  = XMLDocument.getChildTags((Element) subList.get(0));            // get options after --            tmpCl  = "";            for (i = 0; i < subList.size(); i++)               tmpCl = toCommandLine(tmpCl, (Element) subList.get(i), depth + 1);            // add options            tmpCl = tmpCl.trim();            if (!tmpCl.equals(""))               newCl += " -- " + tmpCl;         }         else         if (parent.getAttribute(ATT_TYPE).equals(VAL_TYPE_QUOTES)) {            newCl += " ";            // opening quote            for (i = 1; i < getQuotesLevel(parent); i++)               newCl += "\\";            newCl += "\"";            // options            tmpCl = "";            for (i = 0; i < subList.size(); i++)               tmpCl = toCommandLine(tmpCl, (Element) subList.get(i), depth + 1);            newCl += tmpCl.trim();            // closing quote            for (i = 1; i < getQuotesLevel(parent); i++)               newCl += "\\";            newCl += "\"";         }      }            // add to existing command line      cl += " " + newCl.trim();            return cl.trim();   }      /**    * returns the given DOM document as command line    * @return the document as command line    * @throws Exception if anything goes wrong initializing the parsing    */   public String toCommandLine() throws Exception {      return toCommandLine(new String(), getDocument().getDocumentElement(), 0);   }      /**    * returns the current DOM document as string array (takes care of quotes!)    * @return the document as string array    * @throws Exception if anything goes wrong initializing the parsing    */   public String[] toArray() throws Exception {       String         cl;       Vector         result;       boolean        quotes;       boolean        backslash;       boolean        add;       int            i;       String         tmpStr;              cl     = toCommandLine();       result = new Vector();              // break up string       quotes    = false;       backslash = false;       tmpStr    = "";       for (i = 0; i < cl.length(); i++) {          add = true;                    switch (cl.charAt(i)) {             case '\\' :                backslash = true;                break;                             case '"' :                // can we toggle quotes? (ignore nested quotes)                if (!backslash) {                   quotes = !quotes;                   add    = false;                }                backslash = false;                break;                            case ' ' :                // if not quoted then break!                if (!quotes) {                   result.add(tmpStr.replaceAll("\\\\\"", "\""));                   add    = false;                   tmpStr = "";                }                break;          }          if (add)             tmpStr += "" + cl.charAt(i);       }              // add last part       if (!tmpStr.equals(""))          result.add(tmpStr);              return (String[]) result.toArray(new String[1]);   }      /**    * returns the object in a string representation (as indented XML output)    *     * @return the object in a string representation    */   public String toString() {      return getXMLDocument().toString();   }      /**    * for testing only. prints the given XML, the resulting commandline and    * the string array.    */   public static void main(String[] args) throws Exception {      if (args.length > 0) {         System.out.println("\nXML:\n\n" + new XMLOptions(args[0]).toString());                    System.out.println("\nCommandline:\n\n" + new XMLOptions(args[0]).toCommandLine());                  System.out.println("\nString array:\n");         String[] options = new XMLOptions(args[0]).toArray();         for (int i = 0; i < options.length; i++)            System.out.println(options[i]);      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -