001    import java.io.IOException;
002    import org.apache.xerces.parsers.DOMParser;
003    import org.w3c.dom.*;
004    import org.xml.sax.SAXException;
005    
006    /**
007     * This class provides static methods to analyse and display a DOM 
008     * structure of an XML Document
009     * @author Udo Altmann
010     * @version 1.0
011     * 
012     */
013    
014    public class analyse {
015    
016            /**
017             * @param args File to be analysed
018             * @throws IOException
019             * @throws SAXException
020             */
021            public static void main(String args[]) throws IOException, SAXException {
022                    DOMParser dp = new DOMParser();
023                    //
024                    // Es gibt keine DOM-Methode zum Anlegen von Documenten
025                    // 
026                    dp.parse(args[0]);
027                    //
028                    // Die Verarbeitung startet mit dem Interface Document
029                    // 
030                    Document doc = dp.getDocument();
031                    //
032                    // Dokumente sind auch Knoten
033                    // 
034                    process(doc);
035            }
036    
037            /**
038             * @param nd Node to be analysed. Child nodes are processed recursively
039             */
040            public static void process(Node nd) {
041                    System.out.println(
042                            "Node type:\t"
043                                    + nd.getNodeType()
044                                    + " - "
045                                    + nodeTypeToString(nd.getNodeType()));
046                    System.out.println("\tname:\t" + nd.getNodeName());
047                    System.out.println("\tvalue:\t\"" + nd.getNodeValue() + "\"");
048                    if (nd.getParentNode() != null) {
049                            System.out.println(
050                                    "\tparent:\t"
051                                            + nodeTypeToString(nd.getParentNode().getNodeType())
052                                            + "\t"
053                                            + nd.getParentNode().getNodeName());
054                    } else {
055                            System.out.println("\tno parent\t");
056                    }
057                    System.out.println("\tspecific details:\t");
058                    //nd.
059                    switch (nd.getNodeType()) {
060                            case Node.DOCUMENT_NODE :
061                                    Document doc = (Document) nd;
062                                    System.out.println(
063                                            "\t\tDocumentElement: "
064                                                    + doc.getDocumentElement().getNodeName());
065                                    break;
066                            case Node.ELEMENT_NODE :
067                                    Element el = (Element) nd;
068                                    //
069                                    // hasAttributes ist nicht in DOM-Level 1!
070                                    //
071                                    if (el.hasAttributes()) {
072                                            System.out.println("\t\tgetTagName: " + el.getTagName());
073                                            System.out.println("\t\tAttribute:");
074                                            NamedNodeMap nnm = el.getAttributes();
075                                            int i;
076                                            for (i = 0; i < nnm.getLength(); i++) {
077                                                    process(nnm.item(i));
078                                            }
079                                    } else {
080                                            System.out.println("\t\tno attributes!");
081                                    }
082                                    break;
083                            case Node.ATTRIBUTE_NODE :
084                                    Attr at = (Attr) nd;
085                                    System.out.println("\t\tgetName:" + at.getName());
086                                    System.out.println("\t\tspecified: " + at.getSpecified());
087                                    System.out.println("\t\tgetValue: " + at.getValue());
088                                    break;
089                            case Node.COMMENT_NODE :
090                                    Comment cm = (Comment) nd;
091                                    System.out.println("\t\tgetData: " + cm.getData());
092                                    System.out.println("\t\tgetLength: " + cm.getLength());
093                                    break;
094                            case Node.TEXT_NODE :
095                                    Text tn = (Text) nd;
096                                    System.out.println("\t\tgetData: " + tn.getData());
097                                    System.out.println("\t\tgetLength: " + tn.getLength());
098                                    break;
099                            case Node.CDATA_SECTION_NODE :
100                                    Text cs = (Text) nd;
101                                    System.out.println("\t\tgetData: " + cs.getData());
102                                    System.out.println("\t\tgetLength: " + cs.getLength());
103                                    break;
104                            case Node.DOCUMENT_TYPE_NODE :
105                                    int i;
106                                    DocumentType dt = (DocumentType) nd;
107                                    System.out.println("\t\tgetName: " + dt.getName());
108                                    System.out.println("\t\tgetPublicId: " + dt.getPublicId());
109                                    System.out.println("\t\tgetSytemId: " + dt.getSystemId());
110                                    //
111                                    // DOM 2 und parserabhängig
112                                    //
113                                    System.out.println(
114                                            "\t\tgetInternalSubset: " + dt.getInternalSubset());
115                                    NamedNodeMap nnm = dt.getEntities();
116                                    if (nnm.getLength() <= 0) {
117                                            System.out.println("\t\tno Entities");
118                                    } else {
119                                            for (i = 0; i < nnm.getLength(); i++) {
120                                                    process(nnm.item(i));
121                                            }
122                                    }
123                                    nnm = dt.getNotations();
124                                    if (nnm.getLength() <= 0) {
125                                            System.out.println("\t\tno Notations");
126                                    } else {
127                                            for (i = 0; i < nnm.getLength(); i++) {
128                                                    process(nnm.item(i));
129                                            }
130                                    }
131                                    break;
132                            case Node.NOTATION_NODE :
133                                    Notation no = (Notation) nd;
134                                    System.out.println("\t\tgetPublicId: " + no.getPublicId());
135                                    System.out.println("\t\tgetSytemId: " + no.getSystemId());
136                                    break;
137                            case Node.ENTITY_NODE :
138                                    Entity en = (Entity) nd;
139                                    System.out.println(
140                                            "\t\tgetNotationName: " + en.getNotationName());
141                                    System.out.println("\t\tgetPublicId: " + en.getPublicId());
142                                    System.out.println("\t\tgetSytemId: " + en.getSystemId());
143                                    break;
144                            case Node.PROCESSING_INSTRUCTION_NODE :
145                                    ProcessingInstruction pe = (ProcessingInstruction) nd;
146                                    System.out.println("\t\tgetTarget: " + pe.getTarget());
147                                    System.out.println("\t\tgetData: " + pe.getData());
148                                    break;
149                                    // 
150                                    // Für die folgenden Knotentyp gibt es keine speziellen Attribute/Methoden
151                                    // 
152                            case Node.ENTITY_REFERENCE_NODE :
153                                    //
154                                    // EntityRefences werden evtl. nicht erkannt, wenn sie beim Parsen ersetzt werden
155                                    // 
156                                    // EntityReference er = (EntityReference) nd;
157                                    // break;
158                            case Node.DOCUMENT_FRAGMENT_NODE :
159                                    // DocumentFragment df = (DocumentFragment) nd; 
160                                    // break;
161                            default :
162                                    System.out.println("\t\tno details!");
163                    }
164                    if (nd.hasChildNodes()) {
165                            NodeList nl = nd.getChildNodes();
166                            int i;
167                            for (i = 0; i < nl.getLength(); i++) {
168                                    process(nl.item(i));
169                            }
170                    }
171            }
172    
173            /**
174             * Static method to convert Nodetypes to Strings
175             * @param s Type as short
176             * @return Type as String
177             */
178            public static String nodeTypeToString(short s) {
179    
180                    switch (s) {
181                            case Node.ATTRIBUTE_NODE :
182                                    return "ATTRIBUTE_NODE";
183                            case Node.CDATA_SECTION_NODE :
184                                    return "CDATA_SECTION_NODE";
185                            case Node.COMMENT_NODE :
186                                    return "COMMENT_NODE";
187                            case Node.DOCUMENT_FRAGMENT_NODE :
188                                    return "DOCUMENT_FRAGMENT_NODE";
189                            case Node.DOCUMENT_NODE :
190                                    return "DOCUMENT_NODE";
191                            case Node.DOCUMENT_TYPE_NODE :
192                                    return "DOCUMENT_TYPE_NODE";
193                            case Node.ELEMENT_NODE :
194                                    return "ELEMENT_NODE";
195                            case Node.ENTITY_NODE :
196                                    return "ENTITY_NODE";
197                            case Node.ENTITY_REFERENCE_NODE :
198                                    return "ENTITY_REFERENCE_NODE";
199                            case Node.NOTATION_NODE :
200                                    return "NOTATION_NODE";
201                            case Node.PROCESSING_INSTRUCTION_NODE :
202                                    return "PROCESSING_INSTRUCTION_NODE";
203                            case Node.TEXT_NODE :
204                                    return "TEXT_NODE";
205                            default :
206    
207                                    return null;
208                    }
209            }
210    
211    
212    }