Inhoudsopgave:
Video: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024
Je kunt aangepaste code bouwen met JAXB - de Java API voor XML Binding . Met JAXB neemt u een XML-document en maakt u een Java-klassenbestand dat perfect is voor het verwerken van het document. Wanneer uw behoeften veranderen en de klas niet meer doet wat u wilt, maakt u een nieuwe subklasse.
Wanneer u SAX- of DOM-code schrijft, maakt u een XML-verwerkingsprogramma. Je programma leest een document en gebruikt het document om nuttig werk te doen - te beginnen met iets ongevaarlijks, zoals een publiekelijk nietig startElement of knooppunt. getNodeName (). Hoe dan ook, je programma maakt geen aannames over wat er in het document zit. Het document heeft een rootelement, enkele onderliggende elementen, en dat is alles. Eventuele speciale aannames die u over dit document maakt, versmallen feitelijk de bruikbaarheid van de code.
Veelzijdige code versus aangepaste code
Overweeg de code in Listings 1 en 2. Listing 1, scant vijf knooppunten in een documentstructuur. Die vijf knooppunten moeten op een bepaalde manier worden gerangschikt, anders schiet het programma vast. (De lijst wil een opmerking en een hoofdknooppunt, met minstens twee kinderen direct onder het basisknooppunt.)
Listing 1: enkele knooppunten weergeven
org importeren. w3c. dom. Knooppunt;
import org. w3c. dom. NamedNodeMap;
class MyTreeTraverser
{
MyTreeTraverser (knooppunt knooppunt)
{
systeem. uit. println (knooppunt. getNodeName ());
knooppunt = knooppunt. getFirstChild ();
Systeem. uit. println (knooppunt. getNodeName ());
knooppunt = knooppunt. getNextSibling ();
Systeem. uit. println (knooppunt. getNodeName ());
knooppunt = knooppunt. getFirstChild ();
Systeem. uit. println (knooppunt. getNodeName ());
knooppunt = knooppunt. getNextSibling ();
Systeem. uit. println (knooppunt. getNodeName ());
}
}
Listing 2: Traceer de DOM-tree
importeer org. w3c. dom. Knooppunt;
import org. w3c. dom. NamedNodeMap;
klasse MyTreeTraverser
{
Knooppunt knooppunt;
MyTreeTraverser (knooppunt knooppunt)
{
dit. knooppunt = knooppunt;
Selecteer ();
displayValue ();
if (knooppunt. GetNodeType () == Node. ELEMENT_NODE)
displayAttributes ();
Systeem. uit. println ();
displayChildren ();
}
void displayName ()
{
Systeem. uit. print naam: ");
Systeem. uit. println (knooppunt. getNodeName ());
}
void displayValue ()
{
String nodeValue = knooppunt. getNodeValue ();
if (nodeValue! = Null)
nodeValue = nodeValue. trimmen ();
Systeem. uit. print ("Waarde:");
Systeem. uit. println (nodeValue);
}
void displayAttributes ()
{
NamedNodeMap attribs = node. GetAttributes ();
voor (int i = 0; i { Systeem. uit. println (); Systeem. uit. print ("Kenmerk:"); Systeem. uit. print (attribs. item (i). getNodeName ()); Systeem. uit. print ("="); Systeem. uit. println (attribs. item (i). getNodeValue ()); } } void displayChildren () { Knooppuntkind = knooppunt. getFirstChild (); while (child! = Null) { nieuwe MyTreeTraverser (child); kind = kind. getNextSibling (); } } } De code in listing 2 is veel algemener. Deze code controleert de documentstructuur terwijl deze wordt uitgevoerd. Wanneer de code een kindknoop vindt, scant het het kind en zoekt het naar kleinkinderen. Als er geen kleinkinderen zijn, zoekt de code naar broers en zussen. De code kan elke documentstructuur aan - of het nu een knooppunt of duizend knooppunten betreft. Zo is listing 2 veelzijdiger dan listing 1. Deze veelzijdigheid kent echter ook nadelen - inclusief de mogelijkheid van zeer hoge overheadkosten. De code in Listing 2 moet het volledige XML-document ontleden en vervolgens een weergave van de structuur van het document in het geheugen van de computer plaatsen. Als het document erg groot is, is de weergave groot: het geheugen wordt opgeblazen door al die tijdelijke gegevens en de code in listing 2 wordt langzamer. Stel u voor dat u probeert naar Faneuil Hall in Boston, Massachusetts te rijden. Het maakt niet uit waar je begint; de reis zal altijd verwarrend en moeilijk zijn. Hoe dan ook, je moet je route plannen. Je kunt verdwalen in het nabijgelegen Revere of Cambridge of in het centrum van Boston. Afhankelijk van uw bronnen heeft u twee opties: Het gebruik van de papieren kaart kost meer werk (meer tijd, moeite, behendigheid en geduld) dan het gebruik van de sprekende GPS. Waarom? Omdat de papieren kaart niet is aangepast aan uw specifieke behoeften; in feite staat er: "Hier is het hele metropolitaanse gebied van Boston. Faneuil Hall zit daar ergens in. U komt erachter wat u vervolgens moet doen. " Een aangepast systeem is (zoals u zou verwachten) gemakkelijker te gebruiken dan een systeem dat niet is aangepast aan uw onmiddellijke situatie. De XML-verwerkingscode van Listing 2 maakt dus een enorme, resource-gulping DOM-boom in de geheugenruimte van je computer ("Hier is de boom - jij komt erachter wat je vervolgens moet doen …") omdat de code niet ' t aangepast.De code werkt voor elk oud document - niet alleen degene die u bij de hand hebt - en haalt altijd middelen bij elkaar om het te doen. Het idee achter JAXB is om op maat gemaakte lessen te maken die aan uw huidige behoeften voldoen. U neemt de beschrijving van een XML-document, voert het door een speciaal programma, een schema-compilator , en krijgt een geheel nieuwe klasse, de gegenereerde klasse . Deze gegenereerde klasse is gestroomlijnd om met bepaalde XML-documenten te werken. Als uw XML-documenten bijvoorbeeld elementen met de naam Total hebben, kan de gegenereerde klasse setTotal en getTotal-methoden hebben. Als het element van een document een kenmerk fullName heeft, kan de gegenereerde klasse de methoden setFullName en getFullName hebben. (Zie afbeelding 1.) De verbinding tussen een deel van een XML-document en een deel van een Java-klasse wordt een binding genoemd. Met al deze bindingen vertegenwoordigt een exemplaar van de klasse een enkel XML-document. Dus hoe verbindt u een object met een XML-document? Nou, de gegenereerde klasse heeft methoden met de naam unmarshal en marshal. (Zie afbeelding 2.) Met methoden zoals deze kunt u de gegevens in een XML-document ophalen en wijzigen.De voordelen van maatwerk
De essentie van JAXB