- Home
- Categorie
- La Community Connect.gt
- Presentati alla Community
- Implementazione parser
-
Implementazione parser
Salve a tutti,
ho un (piccolo) problema: ho realizzato un browser in java e dovrei eseguire il parsing di file xml. Per il parsing utilizzo la classe SAXTreeViewer, ma non riesco a implementarla nel codice browser. Sapreste darmi una mano?
graziebrowser:
class Webbrowser implements ActionListener
{
JTextField t1;
JLabel l1;
JButton b1;
GridBagLayout gbl;
GridBagConstraints gbc;
JPanel p;
JFrame frame;
JScrollPane scrollPane;
JEditorPane jep;
static String initialPage;public Webbrowser()
{
//JFrame.setDefaultLookAndFeelDecorated(true);
/try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e)
{
e.printStackTrace();
}/
frame=new JFrame("Chicco's Web Browser");gbl=new GridBagLayout();
gbc=new GridBagConstraints();p=new JPanel();
p.setLayout(gbl);jep = new JEditorPane();
t1=new JTextField();
b1=new JButton("Trova");
b1.addActionListener(this);
frame.getRootPane().setDefaultButton(b1);l1=new JLabel("Indirizzo");
gbc.anchor=GridBagConstraints.NORTHEAST;
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.gridx=0;
gbc.gridy=0;
gbc.weightx=0.0;
gbl.setConstraints(l1,gbc);
p.add(l1);gbc.anchor=GridBagConstraints.NORTHEAST;
gbc.gridx=1;
gbc.gridy=0;
gbc.weightx=1.0;
gbl.setConstraints(t1,gbc);
p.add(t1);gbc.anchor=GridBagConstraints.NORTHWEST;
gbc.gridx=2;
gbc.gridy=0;
gbc.weightx=0.0;
gbl.setConstraints(b1,gbc);
p.add(b1);scrollPane = new JScrollPane(jep); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(p,BorderLayout.NORTH);
frame.getContentPane().add(scrollPane);
frame.setSize(1000,700);
frame.setVisible(true);
}public void actionPerformed(ActionEvent e)
{
initialPage=t1.getText();
char a=initialPage.charAt(0);
char b=initialPage.charAt(1);
char c=initialPage.charAt(2);
char d=initialPage.charAt(3);
char ea=initialPage.charAt(4);
char f=initialPage.charAt(5);
char g=initialPage.charAt(6);if((a=='h')&&(b=='t')&&(c=='t')&&(d=='p')&&(ea==':')&&(f=='/')&&(g=='/'))
{
initialPage=t1.getText();
}
else
{
initialPage="<A href="http://"+initialPage">http://"+initialPage;
}
jep.setEditable(false);
jep.addHyperlinkListener(new second(jep));
try
{
jep.setPage(initialPage);
}
catch (IOException ae)
{
JOptionPane.showMessageDialog(frame,new String("Error: "+ae));
}
}public static void main(String[] args)
{
new Webbrowser();
}
}
class second implements HyperlinkListener
{
private JEditorPane pane;public second(JEditorPane pane)
{
this.pane = pane;
}
public void hyperlinkUpdate(HyperlinkEvent evt)
{
if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
{
try
{
pane.setPage(evt.getURL());
}
catch (Exception e){}}}}
public class browser extends javax.swing.JFrame {public browser() { initComponents(); } // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); openMenuItem = new javax.swing.JMenuItem(); saveMenuItem = new javax.swing.JMenuItem(); saveAsMenuItem = new javax.swing.JMenuItem(); exitMenuItem = new javax.swing.JMenuItem(); editMenu = new javax.swing.JMenu(); cutMenuItem = new javax.swing.JMenuItem(); copyMenuItem = new javax.swing.JMenuItem(); pasteMenuItem = new javax.swing.JMenuItem(); deleteMenuItem = new javax.swing.JMenuItem(); helpMenu = new javax.swing.JMenu(); contentsMenuItem = new javax.swing.JMenuItem(); aboutMenuItem = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); fileMenu.setText("File"); openMenuItem.setText("Open"); fileMenu.add(openMenuItem); saveMenuItem.setText("Save"); fileMenu.add(saveMenuItem); saveAsMenuItem.setText("Save As ..."); fileMenu.add(saveAsMenuItem); exitMenuItem.setText("Exit"); exitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exitMenuItemActionPerformed(evt); } }); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); editMenu.setText("Edit"); cutMenuItem.setText("Cut"); editMenu.add(cutMenuItem); copyMenuItem.setText("Copy"); editMenu.add(copyMenuItem); pasteMenuItem.setText("Paste"); editMenu.add(pasteMenuItem); deleteMenuItem.setText("Delete"); editMenu.add(deleteMenuItem); menuBar.add(editMenu); helpMenu.setText("Help"); contentsMenuItem.setText("Contents"); helpMenu.add(contentsMenuItem); aboutMenuItem.setText("About"); helpMenu.add(aboutMenuItem); menuBar.add(helpMenu); setJMenuBar(menuBar); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 279, Short.MAX_VALUE) ); pack(); }// </editor-fold> private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } public static void main (String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new browser().setVisible(true); Webbrowser wb = new Webbrowser(); } }); } // Variables declaration - do not modify private javax.swing.JMenuItem aboutMenuItem; private javax.swing.JMenuItem contentsMenuItem; private javax.swing.JMenuItem copyMenuItem; private javax.swing.JMenuItem cutMenuItem; private javax.swing.JMenuItem deleteMenuItem; private javax.swing.JMenu editMenu; private javax.swing.JMenuItem exitMenuItem; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem openMenuItem; private javax.swing.JMenuItem pasteMenuItem; private javax.swing.JMenuItem saveAsMenuItem; private javax.swing.JMenuItem saveMenuItem; // End of variables declaration
}
Classe SAX:
public class SAXTreeViewer extends JFrame {
/** Default parser to use /
private String vendorParserClass =
"org.apache.xerces.parsers.SAXParser";
/* The base tree to render /
private JTree jTree;
/* Tree model to use /
DefaultTreeModel defaultTreeModel;
/*
* <p> This initializes the needed Swing settings. </p>
/
public SAXTreeViewer() {
// Handle Swing setup
super("SAX Tree Viewer");
setSize(600, 450);
}
/*
* <p> This will construct the tree using Swing. </p>
*
* @param filename <code>String</code> path to XML document.
*/
public void init(String xmlURI) throws IOException, SAXException {
DefaultMutableTreeNode base =
new DefaultMutableTreeNode("XML Document: " +
xmlURI);// Build the tree model defaultTreeModel = new DefaultTreeModel(base); jTree = new JTree(defaultTreeModel); // Construct the tree hierarchy buildTree(defaultTreeModel, base, xmlURI); // Display the results getContentPane().add(new JScrollPane(jTree), BorderLayout.CENTER); } /** * <p>This handles building the Swing UI tree.</p> * * @param treeModel Swing component to build upon. * @param base tree node to build on. * @param xmlURI URI to build XML document from. * @throws <code>IOException</code> - when reading the XML URI fails. * @throws <code>SAXException</code> - when errors in parsing occur. */ public void buildTree(DefaultTreeModel treeModel, DefaultMutableTreeNode base, String xmlURI) throws IOException, SAXException { // Create instances needed for parsing XMLReader reader = XMLReaderFactory.createXMLReader(vendorParserClass); ContentHandler jTreeContentHandler = new JTreeContentHandler(treeModel, base); ErrorHandler jTreeErrorHandler = new JTreeErrorHandler(); // Register content handler reader.setContentHandler(jTreeContentHandler); // Register error handler reader.setErrorHandler(jTreeErrorHandler); // Parse InputSource inputSource = new InputSource(xmlURI); reader.parse(inputSource); } /** * <p> Static entry point for running the viewer. </p> */ public static void main(String[] args) { try { /* if (args.length != 1) { System.out.println( "Usage: java SAXTreeViewer " + "[XML Document URI]"); System.exit(0); }*/ SAXTreeViewer viewer = new SAXTreeViewer(); //viewer.init(args[0]); viewer.init("[file.xml](http://www.freeitaly.it/gadget.xml)"); viewer.setVisible(true); } catch (Exception e) { e.printStackTrace(); } }
}
/**- <b><code>JTreeContentHandler</code></b> implements the SAX
- <code>ContentHandler</code> interface and defines callback
- behavior for the SAX callbacks associated with an XML
- document's content, bulding up JTree nodes.
/
class JTreeContentHandler implements ContentHandler {
/* Hold onto the locator for location information /
private Locator locator;
/* Store URI to prefix mappings /
private Map namespaceMappings;
/* Tree Model to add nodes to /
private DefaultTreeModel treeModel;
/* Current node to add sub-nodes to /
private DefaultMutableTreeNode current;
/*- <p> Set up for working with the JTree. </p>
- @param treeModel tree to add nodes to.
- @param base node to start adding sub-nodes to.
/
public JTreeContentHandler(DefaultTreeModel treeModel,
DefaultMutableTreeNode base) {
this.treeModel = treeModel;
this.current = base;
this.namespaceMappings = new HashMap();
}
/* - <p>
- Provide reference to <code>Locator</code> which provides
- information about where in a document callbacks occur.
- </p>
- @param locator <code>Locator</code> object tied to callback
-
process
public void setDocumentLocator(Locator locator) {
// Save this for later use
this.locator = locator;
}
/*-
<p>
-
This indicates the start of a Document parse-this precedes
-
all callbacks in all SAX Handlers with the sole exception
-
of <code>{@link #setDocumentLocator}</code>.
-
</p>
-
@throws <code>SAXException</code> when things go wrong
/
public void startDocument() throws SAXException {
// No visual events occur here
}
/* -
<p>
-
This indicates the end of a Document parse-this occurs after
-
all callbacks in all SAX Handlers.</code>.
-
</p>
-
@throws <code>SAXException</code> when things go wrong
/
public void endDocument() throws SAXException {
// No visual events occur here
}
/* -
<p>
-
This indicates that a processing instruction (other than
-
the XML declaration) has been encountered.
-
</p>
-
@param target <code>String</code> target of PI
-
@param data <code>String</code containing all data sent to the PI.
-
This typically looks like one or more attribute value
-
pairs.
-
@throws <code>SAXException</code> when things go wrong
/
public void processingInstruction(String target, String data)
throws SAXException {
DefaultMutableTreeNode pi =
new DefaultMutableTreeNode("PI (target = '" + target +
"', data = '" + data + "')");
current.add(pi);
}
/* -
<p>
-
This indicates the beginning of an XML Namespace prefix
-
mapping. Although this typically occurs within the root element
-
of an XML document, it can occur at any point within the
-
document. Note that a prefix mapping on an element triggers
-
this callback <i>before</i> the callback for the actual element
-
itself (<code>{@link #startElement}</code>) occurs.
-
</p>
-
@param prefix <code>String</code> prefix used for the namespace
-
being reported
-
@param uri <code>String</code> URI for the namespace
-
being reported
-
@throws <code>SAXException</code> when things go wrong
/
public void startPrefixMapping(String prefix, String uri) {
// No visual events occur here.
namespaceMappings.put(uri, prefix);
}
/* -
<p>
-
This indicates the end of a prefix mapping, when the namespace
-
reported in a <code>{@link #startPrefixMapping}</code> callback
-
is no longer available.
-
</p>
-
@param prefix <code>String</code> of namespace being reported
-
@throws <code>SAXException</code> when things go wrong
/
public void endPrefixMapping(String prefix) {
// No visual events occur here.
for (Iterator i = namespaceMappings.keySet().iterator();
i.hasNext(); ) {
String uri = (String)i.next();
String thisPrefix = (String)namespaceMappings.get(uri);
if (prefix.equals(thisPrefix)) {
namespaceMappings.remove(uri);
break;
}
}
}
/* -
<p>
-
This reports the occurrence of an actual element. It includes
-
the element's attributes, with the exception of XML vocabulary
-
specific attributes, such as
-
<code>xmlns:[namespace prefix]</code> and
-
<code>xsi:schemaLocation</code>.
-
</p>
-
@param namespaceURI <code>String</code> namespace URI this element
-
is associated with, or an empty <code>String</code>
-
@param localName <code>String</code> name of element (with no
-
namespace prefix, if one is present)
-
@param qName <code>String</code> XML 1.0 version of element name:
-
[namespace prefix]:[localName]
-
@param atts <code>Attributes</code> list for this element
-
@throws <code>SAXException</code> when things go wrong
/
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts)
throws SAXException {
DefaultMutableTreeNode element =
new DefaultMutableTreeNode("Element: " + localName);
current.add(element);
current = element;
// Determine namespace
if (namespaceURI.length() > 0) {
String prefix =
(String)namespaceMappings.get(namespaceURI);
if (prefix.equals("")) {
prefix = "[None]";
}
DefaultMutableTreeNode namespace =
new DefaultMutableTreeNode("Namespace: prefix = '" +
prefix + "', URI = '" + namespaceURI + "'");
current.add(namespace);
}
// Process attributes
for (int i=0; i<atts.getLength(); i++) {
DefaultMutableTreeNode attribute =
new DefaultMutableTreeNode("Attribute (name = '" +
atts.getLocalName(i) +
"', value = '" +
atts.getValue(i) + "')");
String attURI = atts.getURI(i);
if (attURI.length() > 0) {
String attPrefix =
(String)namespaceMappings.get(namespaceURI);
if (attPrefix.equals("")) {
attPrefix = "[None]";
}
DefaultMutableTreeNode attNamespace =
new DefaultMutableTreeNode("Namespace: prefix = '" +
attPrefix + "', URI = '" + attURI + "'");
attribute.add(attNamespace);
}
current.add(attribute);
}
}
/* -
<p>
-
Indicates the end of an element
-
(<code></[element name]></code>) is reached. Note that
-
the parser does not distinguish between empty
-
elements and non-empty elements, so this occurs uniformly.
-
</p>
-
@param namespaceURI <code>String</code> URI of namespace this
-
element is associated with
-
@param localName <code>String</code> name of element without prefix
-
@param qName <code>String</code> name of element in XML 1.0 form
-
@throws <code>SAXException</code> when things go wrong
/
public void endElement(String namespaceURI, String localName,
String qName)
throws SAXException {
// Walk back up the tree
current = (DefaultMutableTreeNode)current.getParent();
}
/* -
<p>
-
This reports character data (within an element).
-
</p>
-
@param ch <code>char[]</code> character array with character data
-
@param start <code>int</code> index in array where data starts.
-
@param length <code>int</code> index in array where data ends.
-
@throws <code>SAXException</code> when things go wrong
/
public void characters(char[] ch, int start, int length)
throws SAXException {
String s = new String(ch, start, length);
DefaultMutableTreeNode data =
new DefaultMutableTreeNode("Character Data: '" + s + "'");
current.add(data);
}
/* -
<p>
-
This reports whitespace that can be ignored in the
-
originating document. This is typically invoked only when
-
validation is ocurring in the parsing process.
-
</p>
-
@param ch <code>char[]</code> character array with character data
-
@param start <code>int</code> index in array where data starts.
-
@param end <code>int</code> index in array where data ends.
-
@throws <code>SAXException</code> when things go wrong
*/
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {// This is ignorable, so don't display it
}
/** -
<p>
-
This reports an entity that is skipped by the parser. This
-
should only occur for non-validating parsers, and then is still
-
implementation-dependent behavior.
-
</p>
-
@param name <code>String</code> name of entity being skipped
-
@throws <code>SAXException</code> when things go wrong
/
public void skippedEntity(String name) throws SAXException {
DefaultMutableTreeNode skipped =
new DefaultMutableTreeNode("Skipped Entity: '" + name + "'");
current.add(skipped);
}
}
/*
- <b><code>JTreeErrorHandler</code></b> implements the SAX
- <code>ErrorHandler</code> interface and defines callback
- behavior for the SAX callbacks associated with an XML
- document's warnings and errors.
/
class JTreeErrorHandler implements ErrorHandler {
/*-
<p>
-
This will report a warning that has occurred; this indicates
-
that while no XML rules were "broken", something appears
-
to be incorrect or missing.
-
</p>
-
@param exception <code>SAXParseException</code> that occurred.
-
@throws <code>SAXException</code> when things go wrong
*/
public void warning(SAXParseException exception)
throws SAXException {System.out.println("Parsing Warning\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Warning encountered");
}
/** -
<p>
-
This will report an error that has occurred; this indicates
-
that a rule was broken, typically in validation, but that
-
parsing can reasonably continue.
-
</p>
-
@param exception <code>SAXParseException</code> that occurred.
-
@throws <code>SAXException</code> when things go wrong
*/
public void error(SAXParseException exception)
throws SAXException {System.out.println("Parsing Error\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Error encountered");
}
/** -
<p>
-
This will report a fatal error that has occurred; this indicates
-
that a rule has been broken that makes continued parsing either
-
impossible or an almost certain waste of time.
-
</p>
-
@param exception <code>SAXParseException</code> that occurred.
-
@throws <code>SAXException</code> when things go wrong
*/
public void fatalError(SAXParseException exception)
throws SAXException {System.out.println("Parsing Fatal Error\n" +
" Line: " +
exception.getLineNumber() + "\n" +
" URI: " +
exception.getSystemId() + "\n" +
" Message: " +
exception.getMessage());
throw new SAXException("Fatal Error encountered");
}
}
-
Dove colloco SAXTreeViewer nel browser?
-
Sapreste darmi una mano?
...
Dove colloco SAXTreeViewer nel browser?
Nessuno ti rispondera' in quest'areaQui e' solo per le** presentazioni**.
Leggiti meglio i messaggi che hai ricevuto al momento dell'iscrizione e consulta le Regole del forum prima di postare di nuovo.