+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2004 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ Project\r
-//\r
-// XMLNodeRelationAnalyzer.java\r
-// Since: 2005/05/31\r
-//\r
-// $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/analyzer/XMLNodeRelationAnalyzer.java $ \r
-// $Author: leo $\r
-//--------------------------------------\r
-package org.xerial.util.xml.analyzer;\r
-\r
-import static org.xmlpull.v1.XmlPullParser.*;\r
-\r
-import java.io.FileReader;\r
-import java.io.IOException;\r
-import java.io.Reader;\r
-import java.util.TreeMap;\r
-import java.util.TreeSet;\r
-\r
-import org.xerial.core.XerialException;\r
-import org.xerial.util.opt.Argument;\r
-import org.xerial.util.opt.Option;\r
-import org.xerial.util.opt.OptionParser;\r
-import org.xerial.util.opt.OptionParserException;\r
-import org.xerial.util.xml.SinglePathBuilder;\r
-import org.xerial.util.xml.XMLErrorCode;\r
-import org.xerial.util.xml.XMLException;\r
-import org.xerial.util.xml.pullparser.PullParserUtil;\r
-import org.xmlpull.v1.XmlPullParser;\r
-import org.xmlpull.v1.XmlPullParserException;\r
-\r
-/**\r
- * Analyzes ancestor-descendant and parent-child relationships of XML data\r
- * \r
- * @author leo\r
- * \r
- */\r
-public class XMLNodeRelationAnalyzer {\r
- private enum Opt {\r
- help\r
- }\r
-\r
- @Option(symbol = "h", longName = "help", description = "display help message")\r
- private boolean displayHelp = false;\r
-\r
- @Argument(index = 0, name = "XMLFile")\r
- private String xmlFile = null;\r
-\r
- private OptionParser _opt = new OptionParser(this);\r
-\r
- /**\r
- * @throws OptionParserException\r
- * \r
- */\r
- public XMLNodeRelationAnalyzer() throws OptionParserException {\r
-\r
- }\r
-\r
- public static void main(String[] args) {\r
- try {\r
- XMLNodeRelationAnalyzer instance = new XMLNodeRelationAnalyzer();\r
- instance.perform(args);\r
- }\r
- catch (XerialException e) {\r
- System.err.println(e.getMessage());\r
- }\r
- catch (IOException e) {\r
- System.err.println(e.getMessage());\r
- }\r
- }\r
-\r
- public void perform(String[] args) throws OptionParserException, IOException, XerialException {\r
- _opt.parse(args);\r
-\r
- if (displayHelp || xmlFile == null) {\r
- printHelpMessage();\r
- return;\r
- }\r
-\r
- Reader xmlFileReader = new FileReader(xmlFile);\r
- XmlPullParser parser = PullParserUtil.newParser(xmlFileReader);\r
-\r
- ParseProcess parseProcess = new ParseProcess(parser);\r
- parseProcess.parse();\r
-\r
- for (String tag : parseProcess.tag2relatedTagNames.keySet()) {\r
- System.out.print(tag + ":\t");\r
- for (String related : parseProcess.tag2relatedTagNames.get(tag)) {\r
- System.out.print(related + " ");\r
- }\r
- System.out.println();\r
- }\r
-\r
- xmlFileReader.close();\r
- }\r
-\r
- class NodeRelation {\r
-\r
- }\r
-\r
- class ParseProcess {\r
- XmlPullParser parser;\r
- SinglePathBuilder currentPath = new SinglePathBuilder();\r
- TreeMap<String, TreeSet<String>> tag2relatedTagNames = new TreeMap<String, TreeSet<String>>();\r
- int pathCount = 0;\r
-\r
- ParseProcess(XmlPullParser parser) {\r
- this.parser = parser;\r
- }\r
-\r
- void parse() throws IOException, XMLException {\r
-\r
- int state;\r
-\r
- try {\r
- while ((state = parser.next()) != END_DOCUMENT) {\r
- switch (state) {\r
- case START_TAG:\r
- String currentTag = parser.getName();\r
- currentPath.addChild(currentTag);\r
-\r
- TreeSet<String> relatedTagSet = getRelatedTagSet(currentTag);\r
- for (String t : currentPath) {\r
- if (!t.equals(currentTag)) {\r
- relatedTagSet.add(t);\r
- TreeSet<String> relatedTagSet2 = getRelatedTagSet(t);\r
- relatedTagSet2.add(currentTag);\r
- }\r
- }\r
- // TODO attribute processing\r
- for (int i = 0; i < parser.getAttributeCount(); i++) {\r
-\r
- }\r
- break;\r
- case END_TAG:\r
- currentPath.removeLeaf();\r
- break;\r
- case START_DOCUMENT:\r
- break;\r
- case TEXT:\r
- break;\r
- }\r
- }\r
- }\r
- catch (XmlPullParserException e) {\r
- throw new XMLException(XMLErrorCode.PARSE_ERROR, e);\r
- }\r
-\r
- }\r
-\r
- private TreeSet<String> getRelatedTagSet(String tag) {\r
- TreeSet<String> s = tag2relatedTagNames.get(tag);\r
- if (s == null) {\r
- s = new TreeSet<String>();\r
- tag2relatedTagNames.put(tag, s);\r
- }\r
- return s;\r
- }\r
-\r
- }\r
-\r
- private void printHelpMessage() {\r
- System.out.println("usage: > java XMLNodeRelationAnalyzer.jar [option] xml_file");\r
- }\r
-\r
-}\r