JAXP ist eine Java-API zur Verarbeitung von XML. Sie ermöglicht Anwendungen die Analyse und Transformation von XML-Dokumenten. Ihre Funktion ähnelt der JDBC-API, die Funktionen in Methoden abstrahiert. Sie können auf der Apache-Website nach dem neuesten Xerces-Analysator suchen, der das neueste JAXP enthält. Legen Sie es nach dem Herunterladen in Ihr Klassenverzeichnis.
Sehen wir uns an, wie die JTree Swing-Komponente verwendet wird.
Wir alle wissen, dass ein Baum in der Natur normalerweise einen sehr dicken Stamm mit vielen verzweigten Ästen hat. Zwischen jedem Zweig und dem Zweig besteht eine gewisse Verbindung, da sie alle dieselbe Quelle haben: den Stamm. Diese fortdauernde Beziehung ist nicht auf Zweige beschränkt; die menschliche Genealogie folgt demselben Muster. Von den Eltern über die Kinder bis hin zu Kindeskindern und so weiter, bis wir den Überblick verlieren. Ebenso ist das Konzept eines Baums in der Datenspeicherung eine Möglichkeit, Daten auf die gleiche Weise wie ein menschlicher Stammbaum zu speichern. Jeder Zweig des Baums wird als Knoten bezeichnet, jeder Knoten mit untergeordneten Knoten wird als übergeordneter Knoten bezeichnet und der gemeinsame übergeordnete Knoten aller untergeordneten Knoten wird als Wurzelknoten bezeichnet. Eine JTree-Komponente ist eine visuelle Darstellung einer einfachen Baumdatenstruktur.
Fast alle XML-Editoren verfügen über eine visuelle Baumstruktur, mit der Sie Elemente in einem XML-Dokument bearbeiten können. Wir werden bald einen Editor erstellen, aber vorher werfen wir einen Blick auf die JTree-Komponente. Ein Knoten speichert Daten an einer bestimmten Stelle in einem Baum. Um Daten speichern zu können, müssen jeder übergeordnete Knoten und seine untergeordneten Knoten bekannt sein. Das Paket javax.swing.tree definiert einige sehr nützliche Schnittstellen und bietet eine gemeinsame Methode zum Aufbau und Betrieb einer Baumstruktur.
TreeNode-Methode, die für den Zugriff auf Baumknoteninformationen verwendet wird
MutableTreeNode-Methode wird für einen veränderlichen Baum verwendet (kann untergeordnete Knoten hinzufügen oder löschen)
TreeModel-Methode wird zum Erstellen und Verwenden verwendet Verwaltung baumbezogener Datenmodelle.
Als Nächstes erstellen wir eine Klasse, die JTree fortsetzt und Funktionen zum Parsen von XML-Dokumenten und zum Anzeigen von Knoten mithilfe visueller JTree-Komponenten bereitstellt.
XTree-Komponente erstellen
Die XTree-Klasse besteht aus einem Konstruktor und drei Methoden. Der Einfachheit halber kann unsere Komponente nur einen Xtree erstellen, seine Knoten jedoch nicht verarbeitet. Werfen wir einen Blick auf diese Klasse.
Domäne:
PRivate DefaultMutableTreeNode treeNode Diese Mitgliedsvariable speichert das TreeNode-Objekt, das zum Speichern des JTree-Modells verwendet wird.
Die DefaultMutableTreeNode-Klasse ist in javax.swing.tree definiert und stellt standardmäßig eine Implementierung der MutableTreeNode-Schnittstelle bereit.
private DocumentBuilderFactory dbf
private DocumentBuilder db
private Document doc Diese drei Mitgliedsvariablen sind Teil von JAXP und werden verwendet, um XML-Text zu analysieren und ihn in DOM (Document Object) zu konvertieren Modell) Objekt.
Konstruktor
public XTree( String text )
Dieser Konstruktor erstellt ein XTree-Objekt unter Verwendung des an den Konstruktor übergebenen XML-Textes. Nach der Initialisierung einiger grundlegender Anzeigeeigenschaften im Zusammenhang mit der JTree-Superklasse und dem DOM-Analyseobjekt generiert der Konstruktor ein TreeModel-Objekt, das zum Erstellen eines tatsächlichen visuellen Baums verwendet wird. Erstellen Sie einen Wurzelknoten, indem Sie das DOM-Objekt an die Methode createTreeNode() übergeben. Die Methode createTreeNode() gibt ein Objekt vom Typ DefaultMutableTreeNode zurück. Dieses Objekt wird dann verwendet, um das TreeModel des Baums zu erstellen.
Methoden
private DefaultMutableTreeNode createTreeNode( Node root )
Diese Methode nimmt einen DOM-Knoten und durchläuft dann die untergeordneten Knoten rekursiv, bis alle Knoten zum DefaultMutableTreeNode hinzugefügt wurden. Dies ist eine rekursive Methode. Um jeden untergeordneten Knoten unter dem Wurzelknoten zu finden, ruft sie sich jedes Mal selbst auf. JTree kann dann das DefaultMutableTreeNode-Objekt verwenden, da es bereits ein Baum ist.
private String getNodeType(Node node)
Diese Methode wird von createTreeNode() verwendet, um einen String einem bestimmten Knotentyp zuzuordnen.
private Node parseXml()
Diese Methode wird zum Parsen von XML-Textzeichenfolgen verwendet. Sie gibt ein Objekt vom Typ Node zurück, das an die Methode createTreeNode() übergeben werden kann.
Ich habe den folgenden Java-Code bereitgestellt, damit jeder ihn analysieren und studieren kann.
// Geben Sie die W3C-DOM-Klasse ein
import org.w3c.dom.*;
// JAXP-Klasse für DOM-E/A
import javax.xml.parsers .*;
// Standard-Java-Klasse
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java .awt.* ;
import java.awt.event.*;
import java.io.*;
public class XTree erweitert JTree
{
/**
* Diese Mitgliedsvariable speichert das TreeNode-Objekt, das zum Speichern des JTree-Modells verwendet wird.
*Die DefaultMutableTreeNode-Klasse ist in javax.swing.tree definiert.
*Stellt standardmäßig eine Implementierung der MutableTreeNode-Schnittstelle bereit.
*/
private DefaultMutableTreeNode treeNode;
/**
* Diese drei Mitgliedsvariablen sind Teil von JAXP und werden verwendet, um XML-Text zu analysieren und ihn in DOM-Objekte (Document Object Model) zu konvertieren.
*/
private DocumentBuilderFactory dbf;
private DocumentBuilder db;
private Document doc;
/**
* Dieser Konstruktor erstellt ein XTree-Objekt unter Verwendung des an den Konstruktor übergebenen XML-Textes
* @Parametertext ist ein XML-Text im XML-Format
* @Exception ParserConfigurationException, wenn konstruiert. Wenn der Wenn die Funktion den Analysator abnormal einstellt, wird eine Ausnahme ausgelöst
*/
public XTree( String text ) throws ParserConfigurationException
{
super();
// Legen Sie die grundlegenden Eigenschaften des Tree-Renderings fest
getSelectionModel().setSelectionMode (TreeSelectionModel. SINGLE_TREE_SELECTION);
setShowsRootHandles( true );
setEditable( false ); // Ermögliche die Bearbeitung des Baums
// Analysiere das Objekt durch Initialisierung des DOM des Objekts
dbf = DocumentBuilderFactory .newInstance();
dbf.setValidating( false );
db = dbf.newDocumentBuilder();
// Nehmen Sie den DOM-Wurzelknoten und konvertieren Sie ihn in ein JTree-Baummodell
treeNode = createTreeNode( parseXml( text ) );
setModel( new DefaultTreeModel( treeNode ) );
} file://abortXTree()
/**
* Diese Methode nimmt einen DOM-Knoten und durchläuft dann rekursiv die untergeordneten Knoten, bis alle Kontakte zum DefaultMutableTreeNode hinzugefügt wurden.
* Dies ist eine rekursive Methode. Um jeden untergeordneten Knoten unter dem Wurzelknoten zu finden, muss er sich jedes Mal selbst aufrufen.
* JTree kann dann das DefaultMutableTreeNode-Objekt verwenden, da es bereits ein Baum ist.
*
* @Parameter root org.w3c.Node.Node
>
*/
private DefaultMutableTreeNode createTreeNode( Knotenstamm)
{
DefaultMutableTreeNode treeNode = null;
String-Typ, Name, Wert;
NamedNodeMap attribs;
Node attribNode;
//Daten vom Wurzelknoten abrufen
type = getNodeType( root );
name = root.getNodeName();
value = root.getNodeValue();
treeNode = new DefaultMutableTreeNode( root.getNodeType() == Node.TEXT_NODE ? value : name );
// Anzeigeattribute
attribs = root.getAttributes();
if( attribs != null )
{
for( int i = 0; i < attribs.getLength(); i++ )
{
attribNode = attribs.item(i);
name = attribNode.getNodeName(). trim();
value = attribNode.getNodeValue().trim();
if ( value != null )
{
if ( value.length() > 0 )
{
treeNode.add( new DefaultMutableTreeNode( "[Attribute] --> " + name + "="" + value + """ ) );
} file://end if ( value.length() > 0 )
} file://end if ( value != null )
} file://end for( int i = 0; i < attribs.getLength(); i++ )
} file:// end if( attribs != null )
// 假如存在子节点,递归
if( root.hasChildNodes() )
{
NodeListchildren;
int numChildren;
Node node;
String data;
children = root.getChildNodes();
// 假如子节点非空的话,只递归
if(children != null )
{
numChildren = children.getLength();
for (int i=0; i < numChildren; i++)
{
node = children.item(i);
if( node != null )
{
if( node.getNodeType() == Node.ELEMENT_NODE )
{
treeNode.add( createTreeNode(node) );
} file://end if( node.getNodeType() == Node.ELEMENT_NODE )
data = node.getNodeValue();
if( data != null )
{
data = data.trim();
if ( !data.equals(" ") && !data.equals("