Java/XML/StAX
Версия от 18:01, 31 мая 2010; (обсуждение)
Create a StAX Event Tree Viewer
import java.awt.BorderLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.DTD;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class StAXEventTreeViewer extends JFrame {
DefaultMutableTreeNode base = new DefaultMutableTreeNode("XML File");
DefaultTreeModel defaultTreeModel= new DefaultTreeModel(base);
private JTree jTree= new JTree(defaultTreeModel);
public StAXEventTreeViewer()throws XMLStreamException, FileNotFoundException {
setSize(800, 650);
buildTree(defaultTreeModel, base, new File("yourXML.xml"));
getContentPane().add(new JScrollPane(jTree), BorderLayout.CENTER);
setVisible(true);
}
public static void main(String[] args) throws Exception {
new StAXEventTreeViewer();
}
public void buildTree(DefaultTreeModel treeModel, DefaultMutableTreeNode current, File file)
throws XMLStreamException, FileNotFoundException {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = inputFactory.createXMLEventReader(new FileInputStream(file));
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
switch (event.getEventType()) {
case XMLStreamConstants.START_DOCUMENT:
StartDocument startDocument = (StartDocument) event;
DefaultMutableTreeNode version = new DefaultMutableTreeNode(startDocument.getVersion());
current.add(version);
current.add(new DefaultMutableTreeNode(startDocument.isStandalone()));
current.add(new DefaultMutableTreeNode(startDocument.standaloneSet()));
current.add(new DefaultMutableTreeNode(startDocument.encodingSet()));
current.add(new DefaultMutableTreeNode(startDocument.getCharacterEncodingScheme()));
break;
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = (StartElement) event;
QName elementName = startElement.getName();
DefaultMutableTreeNode element = new DefaultMutableTreeNode(elementName.getLocalPart());
current.add(element);
current = element;
if (!elementName.getNamespaceURI().equals("")) {
String prefix = elementName.getPrefix();
if (prefix.equals("")) {
prefix = "[None]";
}
DefaultMutableTreeNode namespace = new DefaultMutableTreeNode("prefix="
+ prefix + ",URI=" + elementName.getNamespaceURI());
current.add(namespace);
}
for (Iterator it = startElement.getAttributes(); it.hasNext();) {
Attribute attr = (Attribute) it.next();
DefaultMutableTreeNode attribute = new DefaultMutableTreeNode("Attribute (name="
+ attr.getName().getLocalPart() + ",value=" + attr.getValue() + "")");
String attURI = attr.getName().getNamespaceURI();
if (!attURI.equals("")) {
String attPrefix = attr.getName().getPrefix();
if (attPrefix.equals("")) {
attPrefix = "[None]";
}
attribute.add(new DefaultMutableTreeNode("prefix = " + attPrefix + ", URI = " + attURI));
}
current.add(attribute);
}
break;
case XMLStreamConstants.END_ELEMENT:
current = (DefaultMutableTreeNode) current.getParent();
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = (Characters) event;
if (!characters.isIgnorableWhiteSpace() && !characters.isWhiteSpace()) {
String data = characters.getData();
if (data.length() != 0) {
current.add(new DefaultMutableTreeNode(characters.getData()));
}
}
break;
case XMLStreamConstants.DTD:
DTD dtde = (DTD) event;
current.add(new DefaultMutableTreeNode(dtde.getDocumentTypeDeclaration()));
default:
System.out.println(event.getClass().getName());
}
}
}
}
Load XML document to a tree with XML stream reader
import java.awt.BorderLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class StAXStreamTreeViewer extends JFrame {
private JTree jTree;
DefaultTreeModel defaultTreeModel;
public StAXStreamTreeViewer()throws Exception {
StAXStreamTreeViewer viewer = new StAXStreamTreeViewer();
File file = new File("yourXML.xml");
DefaultMutableTreeNode base = new DefaultMutableTreeNode("XML Document: "
+ file.getAbsolutePath());
defaultTreeModel = new DefaultTreeModel(base);
jTree = new JTree(defaultTreeModel);
buildTree(defaultTreeModel, base, file);
getContentPane().add(new JScrollPane(jTree), BorderLayout.CENTER);
viewer.setVisible(true);
setSize(800, 450);
}
public static void main(String[] args)throws Exception {
new StAXStreamTreeViewer();
}
public void buildTree(DefaultTreeModel treeModel, DefaultMutableTreeNode current, File file)
throws XMLStreamException, FileNotFoundException {
FileInputStream inputStream = new FileInputStream(file);
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream);
addStartDocumentNodes(reader, current);
parseRestOfDocument(reader, current);
}
private void addStartDocumentNodes(XMLStreamReader reader, DefaultMutableTreeNode current) {
DefaultMutableTreeNode version = new DefaultMutableTreeNode(reader.getVersion());
current.add(version);
DefaultMutableTreeNode standalone = new DefaultMutableTreeNode(reader.isStandalone());
current.add(standalone);
DefaultMutableTreeNode standaloneSet = new DefaultMutableTreeNode(reader.standaloneSet());
current.add(standaloneSet);
DefaultMutableTreeNode encoding = new DefaultMutableTreeNode(reader.getEncoding());
current.add(encoding);
DefaultMutableTreeNode declaredEncoding = new DefaultMutableTreeNode(reader.getCharacterEncodingScheme());
current.add(declaredEncoding);
}
private void parseRestOfDocument(XMLStreamReader reader, DefaultMutableTreeNode current)
throws XMLStreamException {
while (reader.hasNext()) {
int type = reader.next();
switch (type) {
case XMLStreamConstants.START_ELEMENT:
DefaultMutableTreeNode element = new DefaultMutableTreeNode(reader.getLocalName());
current.add(element);
current = element;
if (reader.getNamespaceURI() != null) {
String prefix = reader.getPrefix();
if (prefix == null) {
prefix = "[None]";
}
DefaultMutableTreeNode namespace = new DefaultMutableTreeNode("prefix = ""
+ prefix + "", URI = "" + reader.getNamespaceURI() + """);
current.add(namespace);
}
if (reader.getAttributeCount() > 0) {
for (int i = 0; i < reader.getAttributeCount(); i++) {
DefaultMutableTreeNode attribute = new DefaultMutableTreeNode("Attribute (name = ""
+ reader.getAttributeLocalName(i) + "", value = "" + reader.getAttributeValue(i)
+ "")");
String attURI = reader.getAttributeNamespace(i);
if (attURI != null) {
String attPrefix = reader.getAttributePrefix(i);
if (attPrefix == null || attPrefix.equals("")) {
attPrefix = "[None]";
}
DefaultMutableTreeNode attNamespace = new DefaultMutableTreeNode(
"prefix=" + attPrefix + ",URI=" + attURI);
attribute.add(attNamespace);
}
current.add(attribute);
}
}
break;
case XMLStreamConstants.END_ELEMENT:
current = (DefaultMutableTreeNode) current.getParent();
break;
case XMLStreamConstants.CHARACTERS:
if (!reader.isWhiteSpace()) {
DefaultMutableTreeNode data = new DefaultMutableTreeNode("CD:"
+ reader.getText());
current.add(data);
}
break;
case XMLStreamConstants.DTD:
DefaultMutableTreeNode dtd = new DefaultMutableTreeNode("DTD:" + reader.getText());
current.add(dtd);
break;
case XMLStreamConstants.SPACE:
break;
case XMLStreamConstants.ruMENT:
DefaultMutableTreeNode comment = new DefaultMutableTreeNode(reader.getText());
current.add(comment);
break;
default:
System.out.println(type);
}
}
}
}
Validate Stax
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don"t indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* Validate.java
*
* Created on May 28, 2005, 3:02 PM
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import javax.xml.XMLConstants;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
/**
*
* @author pv156767
*/
public class ValidateStax {
/**
* @param args
* the command line arguments
*/
public static void main(String[] args) {
try {
// TODO code application logic here
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
System.out.println("schema factory instance obtained is " + sf);
Schema schema = sf.newSchema(new File(args[0]));
System.out.println("schema obtained is = " + schema);
// Get a Validator which can be used to validate instance document against
// this grammar.
Validator validator = schema.newValidator();
// Validate this instance document against the Instance document supplied
String fileName = args[1].toString();
String fileName2 = args[2].toString();
javax.xml.transform.Result xmlResult = new javax.xml.transform.stax.StAXResult(
XMLOutputFactory.newInstance().createXMLStreamWriter(new FileWriter(fileName2)));
javax.xml.transform.Source xmlSource = new javax.xml.transform.stax.StAXSource(
getXMLEventReader(fileName));
// validator.validate(new StreamSource(args[1]));
validator.validate(xmlSource, xmlResult);
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("GET CAUSE");
ex.getCause().fillInStackTrace();
}
}
private static XMLEventReader getXMLEventReader(String filename) {
XMLInputFactory xmlif = null;
XMLEventReader xmlr = null;
try {
xmlif = XMLInputFactory.newInstance();
xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.TRUE);
xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
xmlif.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE);
xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
FileInputStream fis = new FileInputStream(filename);
xmlr = xmlif.createXMLEventReader(filename, fis);
} catch (Exception ex) {
ex.printStackTrace();
}
return xmlr;
}
}