1 /*--------------------------------------------------------------------------
\r
2 * Copyright 2004 Taro L. Saito
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
15 *--------------------------------------------------------------------------*/
\r
16 //--------------------------------------
\r
19 // XMLNodeRelationAnalyzer.java
\r
20 // Since: 2005/05/31
\r
22 // $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/analyzer/XMLNodeRelationAnalyzer.java $
\r
24 //--------------------------------------
\r
25 package org.xerial.util.xml.analyzer;
\r
27 import static org.xmlpull.v1.XmlPullParser.*;
\r
29 import java.io.FileReader;
\r
30 import java.io.IOException;
\r
31 import java.io.Reader;
\r
32 import java.util.TreeMap;
\r
33 import java.util.TreeSet;
\r
35 import org.xerial.core.XerialException;
\r
36 import org.xerial.util.opt.Argument;
\r
37 import org.xerial.util.opt.Option;
\r
38 import org.xerial.util.opt.OptionParser;
\r
39 import org.xerial.util.opt.OptionParserException;
\r
40 import org.xerial.util.xml.SinglePathBuilder;
\r
41 import org.xerial.util.xml.XMLErrorCode;
\r
42 import org.xerial.util.xml.XMLException;
\r
43 import org.xerial.util.xml.pullparser.PullParserUtil;
\r
44 import org.xmlpull.v1.XmlPullParser;
\r
45 import org.xmlpull.v1.XmlPullParserException;
\r
48 * Analyzes ancestor-descendant and parent-child relationships of XML data
\r
53 public class XMLNodeRelationAnalyzer {
\r
58 @Option(symbol = "h", longName = "help", description = "display help message")
\r
59 private boolean displayHelp = false;
\r
61 @Argument(index = 0, name = "XMLFile")
\r
62 private String xmlFile = null;
\r
64 private OptionParser _opt = new OptionParser(this);
\r
67 * @throws OptionParserException
\r
70 public XMLNodeRelationAnalyzer() throws OptionParserException {
\r
74 public static void main(String[] args) {
\r
76 XMLNodeRelationAnalyzer instance = new XMLNodeRelationAnalyzer();
\r
77 instance.perform(args);
\r
79 catch (XerialException e) {
\r
80 System.err.println(e.getMessage());
\r
82 catch (IOException e) {
\r
83 System.err.println(e.getMessage());
\r
87 public void perform(String[] args) throws OptionParserException, IOException, XerialException {
\r
90 if (displayHelp || xmlFile == null) {
\r
95 Reader xmlFileReader = new FileReader(xmlFile);
\r
96 XmlPullParser parser = PullParserUtil.newParser(xmlFileReader);
\r
98 ParseProcess parseProcess = new ParseProcess(parser);
\r
99 parseProcess.parse();
\r
101 for (String tag : parseProcess.tag2relatedTagNames.keySet()) {
\r
102 System.out.print(tag + ":\t");
\r
103 for (String related : parseProcess.tag2relatedTagNames.get(tag)) {
\r
104 System.out.print(related + " ");
\r
106 System.out.println();
\r
109 xmlFileReader.close();
\r
112 class NodeRelation {
\r
116 class ParseProcess {
\r
117 XmlPullParser parser;
\r
118 SinglePathBuilder currentPath = new SinglePathBuilder();
\r
119 TreeMap<String, TreeSet<String>> tag2relatedTagNames = new TreeMap<String, TreeSet<String>>();
\r
122 ParseProcess(XmlPullParser parser) {
\r
123 this.parser = parser;
\r
126 void parse() throws IOException, XMLException {
\r
131 while ((state = parser.next()) != END_DOCUMENT) {
\r
134 String currentTag = parser.getName();
\r
135 currentPath.addChild(currentTag);
\r
137 TreeSet<String> relatedTagSet = getRelatedTagSet(currentTag);
\r
138 for (String t : currentPath) {
\r
139 if (!t.equals(currentTag)) {
\r
140 relatedTagSet.add(t);
\r
141 TreeSet<String> relatedTagSet2 = getRelatedTagSet(t);
\r
142 relatedTagSet2.add(currentTag);
\r
145 // TODO attribute processing
\r
146 for (int i = 0; i < parser.getAttributeCount(); i++) {
\r
151 currentPath.removeLeaf();
\r
153 case START_DOCUMENT:
\r
160 catch (XmlPullParserException e) {
\r
161 throw new XMLException(XMLErrorCode.PARSE_ERROR, e);
\r
166 private TreeSet<String> getRelatedTagSet(String tag) {
\r
167 TreeSet<String> s = tag2relatedTagNames.get(tag);
\r
169 s = new TreeSet<String>();
\r
170 tag2relatedTagNames.put(tag, s);
\r
177 private void printHelpMessage() {
\r
178 System.out.println("usage: > java XMLNodeRelationAnalyzer.jar [option] xml_file");
\r