Indholdsfortegnelse:
Video: Week 9 2025
Du kan opbygge brugerdefineret kode med JAXB - Java API til XML-binding . Med JAXB tager du et XML-dokument, og du laver en Java-klassefil, der er perfekt til behandling af dokumentet. Når dine behov ændrer sig, og klassen ikke længere gør hvad du vil have det, gør du bare en ny underklasse.
Når du skriver SAX eller DOM-kode, opretter du et XML-behandlingsprogram. Dit program læser et dokument, og bruger dokumentet til at udføre nyttigt arbejde - startende med noget harmløst som offentlig tomgangstildeling eller knudepunkt. getNodeName (). Uanset hvad, dit program giver ingen antagelser om, hvad der er inde i dokumentet. Dokumentet har et rodelement, nogle barnelementer, og det er alt. Eventuelle særlige antagelser, du laver om dette dokument, begrænser faktisk kodenes brugbarhed.
Alsidig kode versus brugerdefineret kode
Overvej koden i Listings 1 og 2. Listing 1 scanner fem noder i et dokumenttræ. Disse fem noder skal arrangeres på en bestemt måde, ellers kolliderer programmet. (Listingen ønsker en kommentar og en rodknude med mindst to børn direkte under rodknuden.)
Listing 1: Viser et par noder
import org. W3C. dom. Knude;
import org. W3C. dom. NamedNodeMap;
klasse MyTreeTraverser
{
MyTreeTraverser (Node node)
{
System. ud. println (node. getNodeName ());
node = node. getFirstChild ();
System. ud. println (node. getNodeName ());
node = node. getNextSibling ();
System. ud. println (node. getNodeName ());
node = node. getFirstChild ();
System. ud. println (node. getNodeName ());
node = node. getNextSibling ();
System. ud. println (node. getNodeName ());
}
}
Liste 2: Traversering af DOM-træet
import org. W3C. dom. Knude;
import org. W3C. dom. NamedNodeMap;
klasse MyTreeTraverser
{
Node node;
MyTreeTraverser (Node node)
{
dette. node = node;
displayName ();
displayValue ();
hvis (node. GetNodeType () == Knude. ELEMENT_NODE)
displayAttributes ();
System. ud. println ();
displayChildren ();
}
void displayName ()
{
System. ud. Print navn: ");
System. ud. println (node. getNodeName ());
}
void displayValue ()
{
String nodeValue = knudepunkt. getNodeValue ();
hvis (nodeValue! = Null)
nodeValue = nodeValue. trimme();
System. ud. print ("værdi:");
System. ud. println (nodeValue);
}
void displayAttributes ()
{
NamedNodeMap attribs = node. getAttributes ();
for (int i = 0; i { System. ud. println (); System. ud. print ("Attribut:"); System. ud. print (attribs. item (i). getNodeName ()); System. ud. udskrive ("="); System. ud. println (attribs. item (i). getNodeValue ()); } } void displayChildren () { Node barn = node. getFirstChild (); mens (barn! = Null) { ny MyTreeTraverser (barn); barn = barn. getNextSibling (); } } } Koden i liste 2 er meget mere generel. Denne kode kontrollerer dokumentstrukturen, når den kører. Når koden finder en barneknude, scanner den barnet og søger børnebørn. Hvis der ikke er børnebørn, søger koden efter brødre og søstre. Koden kan håndtere ethvert dokumenttræ - om det har en node eller tusind noder. Listing 2 er således mere alsidig end Listing 1. Men denne alsidighed kommer med ulemper - herunder muligheden for meget høj overhead. Koden i Listing 2 skal analysere hele XML-dokumentet - og derefter sætte en repræsentation af dokumentets træ i computerens hukommelse. Hvis dokumentet er meget stort, er repræsentationen stor: Hukommelsen bliver oppustet med alle de midlertidige data, og koden i liste 2 bremses til en gennemgang. Forestil dig at du kører til Faneuil Hall i Boston, Massachusetts. Det er ligegyldigt hvor du starter fra; turen vil altid være forvirrende og vanskelig. Alligevel skal du planlægge din rute. Du kan gå vild i nærliggende Revere eller Cambridge eller i downtown Boston. Afhængigt af dine ressourcer har du to muligheder: Brug af papirkortet tager mere arbejde (mere tid, indsats, fingerfærdighed og tålmodighed) end at bruge den talende GPS. Hvorfor? Fordi papirkortet ikke er tilpasset dine specifikke behov I virkeligheden står det: "Her er hele Boston hovedstadsområde. Faneuil Hall er derinde et sted. Du finde ud af, hvad du skal gøre næste gang. " Et tilpasset system er (som du måske forventer) nemmere at bruge end et, der ikke er skræddersyet til din umiddelbare situation. XML-behandlingskoden til Listing 2 gør således et stort ressourcegulpende DOM-træ i din computers hukommelsesrum ("Her er træet - du find ud af hvad du skal gøre næste …"), fordi koden ikke er ' t tilpasset.Koden fungerer for ethvert gammelt dokument - ikke kun det du har ved hånden - og gobbler altid ressourcer til at gøre det. Tanken bag JAXB er at skabe skræddersyet klasse for at imødekomme dine nuværende behov. Du tager beskrivelsen af et XML-dokument, kører det gennem et særligt program kaldet en skema compiler , og får en helt ny klasse kaldet genereret klasse . Denne genererede klasse er strømlinet til at arbejde med bestemte XML-dokumenter. Hvis dine XML-dokumenter f.eks. Har elementer, der hedder Total, kan den genererede klasse have setTotal og getTotal-metoder. Hvis et dokuments element har en fullName-attribut, kan den genererede klasse have setFullName og getFullName-metoder. (Se figur 1). Forbindelsen mellem en del af et XML-dokument og en del af en Java-klasse kaldes en bindende . Med alle disse bindinger repræsenterer en forekomst af klassen et enkelt XML-dokument. Så hvordan forbinder du et objekt med et XML-dokument? Nå, den genererede klasse har metoder, der hedder umenneskelige og marskalsk. (Se figur 2). Med metoder som disse kan du hente og ændre dataene i et XML-dokument.Fordelene ved tilpasning
Essensen af JAXB