Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

JDOM: FAQ

  

     
     
 

Šta je JDOM?

JDOM je, sasvim jednostavan, Java prikaz XML dokumenta. JDOM pruža način za predstavljanje tog dokumenta za jednostavno i učinkovito čitanje, manipulaciju i pisanje. Ima jednostavan API , lagan je i brz, te je optimiziran za Java programera. To je alternativa za DOM i SAX, iako se dobro integriše i sa DOM i SAX.

Što JDOM nije?

JDOM nije omot za W3C DOM, ili druge verzije DOM. JDOM je Java-based " objektni model dokumenta" za XML datoteke. JDOM služi istoj svrsi kao i DOM, ali je lakši za korišćenje.

JDOM nije XML parser, kao Xerces ili Crimson. To je objektni model dokumenta koji koristi XML parser za izradu dokumenata. JDO-ova SAXBuilder klasa na primer koristi Sax događaje generisane XML parserom za izgradnju JDOM stabla. Uobičajeni XML parser koji koristi JDOM je JAXP-odabrani parser, ali JDOM može koristiti gotovo bilo koji .

Da li je JDOM akronim?

Ne. Baš kao što JDBC nije službeno akronim, nije ni JDOM. To osigurava pridržavanje politike Sun zaštitnog znaka kao što je objašnjeno u http://www.sun.com/policies/trademarks.

Šta je JDOM dozvola?

JDOM je dostupan pod licencom Apache-style sa otvorenim kodom, sa uklonjenom klauzulom o potvrdi prijema uklonjen. Ova licenca je među najmanje restriktivnim licencama koje su dostupne, omogućavajući programerima da koriste JDOM u stvaranju novih proizvoda bez potrebe da ih objave kao otvoreni kod. Ovo je model licence koji koristi Apache Projekt, koji je stvorio Apache server. Dozvola je dostupna na vrhu svake izvorne datoteke i u LICENSE.txt u korenu distribucije.

Gde mogu da dobijem JDOM?

JDOM je dostupan u binarnom i izvornom obliku na http://www.jdom.org.

JDOM je takođe dostupan u maven centrali u skupini 'org.jdom' sa artefaktom ID jdom za JDOM 1.x(i neke ranije 2.x verzije) JDOM Artefakata na mavenu, ili sa artifaktom ID jdom2 za JDOM 2.x: JDOM 2.x Artefakata na mavenu

.

Kompletno spremište izvornog koda održava se on GitHub.

Koji maven artefakt treba da koristim?

Sve JDOM verzije su dostupne u 'jdom' artefaktu u org.jdom grupi na Maven-u. Maven artifakti se ne slazu sa ranim JDOM 2.x verzijama koje se pojavljuju u 'jdom' artifaktu, i 2.x verzijama posle u 'jdom2' artifaktu. Maven ne dozvoljava popravku gresaka, tako da maven korisnici ce jednostavno morati da zive sa tim.

Ako je vaš projekat onaj koji zahteva i JDOM 1.x i 2.x, onda takodje možete koristiti 'jdom-legacy' artifact da bi uvukli verziju 1.1.3 (ili noviju verziju 1.x)

Šta je JDOM Filozofija?

JDOM je razvijen i nastaviće da se razvija sa ovom filozofijom:

  • JDOM bi trebao biti jednostavan za Java programere.
  • JDOM bi trebao da podržava jednostavne i učinkovite modifikacije.
  • JDOM treba da sakriva složenost XML gde god je to moguće, dok održava vernost XML specifikacije.
  • JDOM bi trebalo da se integriše sa DOM i SAX.
  • JDOM bi trebao biti lagan i brz.
  • JDOM bi trebao da reši 80% (ili više) Java/XML problema sa 20% (ili manje) napora

Zašto je JDOM API definisan u smislu konkretnih klasa pre nego sučelja?

Na ovu temu je diskutovano nekoliko puta na JDOM listi slanja, sa nekoliko ljudi na obe strane. U principu, mnogi ljudi osećaju da je višeklasni API bolji kada izrada podklasa nije potrebna, dok je API zasnovan na interfejsu bolji kada je izrada podklasa potrebna. Međutim, bilo koji sistem se može koristiti u bilo kom slučaju.

Jason Hunter sumira argumente protiv API zasnovanog na interfejsu za JDOM

Uz sučelja sve postaje fabrika, elementi moraju biti 'uvezeni u nove dokumente, umesto samo nadograđeni, karakteristike dugoročne serializacije ne mogu biti garantovane, i spisak se nastavlja.

Počeli smo sa sučeljem zapravo. Tokom našeg pregleda pre objavljivanja nekih ravnopravnih uređaja dobili smo informaciju da treba da pokušamo da konkretizujemo klase. Uradili smo to, i dizajn je bio mnogo bolji za njega.

Razmislite o java.io.File kao analogiji. Postoji razlog zbog kojeg kažemo:

File parent = new File(filepath);
File child = new File(parent, "aaa.txt");

umesto

FileSystem fs = FileSystem.getDefaultFileSystem();
File parent = fs.getFile(filepath);
File child = fs.getFile(parent, "aaa.txt");

Bivši je jednostavno lakši i lepši za rukovanje.

Još jedna poenta na umu je da sve što se može učiniti sa sučeljem može biti učinjeno sa izradom podklasa - jedina kazna su verovatno neiskorišćene varijable u osnovnoj klasi

Za referencu, poslednja diskusijana listi slanja na ovu temu započeta je 30. novembra 2000 sa "Interfaces", i nastavljena sa "Interface-based JDOM" i "Announce: JDOMPlus" . To će pomoći da pročitate ovu raspravu pre iznošenja ove teme na mailing listu.

Kako JDOM radi sa DOM i SAX?

JDOM dokumenti mogu se graditi iz XML datoteke, DOM stabla, Sax događaja, ili bilo kojeg drugog izvora. JDOM dokumenti mogu se pretvoriti u XML datoteke, DOM stabla, Sax događaje, ili bilo koje druge destinacije. Ova sposobnost dokazuje korisnost, na primer, kada se integriše sa programom koji očekuje Sax događaje. JDOM može analizirati XML datoteku, puštajući programera da jednostavno i efikasno manipuliše dokumentom, a zatim pušta Sax događaje direktno na Drugi program - nije potrebna konverzija na serijalizovani format.

Da li je JDOM dizajniran za Generics

JDOM je dizajniran pre Generics, ali 2.x je preuzeo dokazani dizajn JDOM 1.x i proširio ga radi korišćenja Generics gde je to moguće. Naime, sve operacije zasnovane na kolekcijama zahtevaju odgovarajuće upisane ulaze, i vraćaju odgovarajuće upisane rezultate. Nadalje, JDOM 2.xe koristi druge Java 5 karakteristike kao što su varargs, i ko-varijante povratnih vrsta.

Generics: Element.getAttributes() returns List<Attribute>, Element.getChildren() returns List<Element>, etc.

Co-variant Return Types: Element.clone() returns Element, Text.detach() returns Text, etc.

Pokušao sam da koristim JDOM i dobio sam grešku kao što je

java.lang.NoSuchMethodError
    or
java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecognizedException

Šta je pogrešno?

Morate osigurati da je xerces.jar datoteka snabdevena sa JDOM preuzimanjem u vašem CLASSPATH-u pre svih drugih XML klasa, kao što su one koje dolaze s JAXP ili Crimson. Ove druge XML datoteke, kao i starije verzije Apache Xerces, podržavaju DOM Level 1 i 1,0 Sax, a ne zahtevani DOM Level 2 i 2,0 Sax. Rezultat je generisanje izuzetka. Proverite vašu putanju klasa, i pokušajte ponovno. Ako putanja klasa izgleda izgleda OK, problematična JAR takođe može biti skrivena u sistemu standardnog produženja direktorijuma (vidi sledeće).

Šta misliš pod "Direktorijum standardne dimenzije"?

Direktorijum standardne dimenzije je direktorijum koji sadrži JAR datoteke koje je tražio automatski Java runtime i prevodilac. Ako ste instalirali JDK (ne samo JRE) možete imati dva odvojena ext direktoruma, od kojih se jedan koristi za prevođenje (obično negde poput C:\jdk1.3\jre\lib\ext) i drugi koji se koristi za izvršavanje koda (obično negde poput C:\Program Files\JavaSoft\jre\1.3\lib\ext). Pogrešna JAR datoteka u bilo kom direktorijumu može vam se isprečiti (iako u različitim vremenima). Nadalje, ispravna JAR datoteka mora biti u oba direktorijuma.

Kako da izbegnem DOM Level 1 problem u Visual Age za Javu?

Kada se WTE karakteristika doda na radni prostor, projekat 'IBM XML Parser for Java' se doda takođe. Ovaj projekat sadrži stare DOM Level 1 'org.w3c. *' interfejse. JDOM se oslanja na DOM Level 2, i stoga conficts sa ovim projektom. Rešenje je da učinite sledeće:

  1. Promenite vlasnika radne površine na Administrator
  2. Stvorite otvoreno izdanje projekta "IBM XML Parser for Java"
  3. Izbriši sve pakete koji sadrže sledeće: org.w3c.* interfejse
  4. Verzirajte projekat.
  5. Stvoriti novi Projekat za DOM Level 2 parser kao Xerces
  6. Uvedite sve Xerces klase, uključujući org.w3c.* sučelja (možete koristiti potpuno drugačiji projekat za ove interfejse, ako želite da radite sa drugim parserom)
  7. Verzirajte Xerces projekat
  8. Kreirajte JDOM projekat i uvezite jdom klase u nju. Verzirajte projekat

(Doprineo Guy Nirpaz)

Kako izbeći DOM Level 1 problem u WebSphere?

WebSphere ima isti problem sa DOM Level 1 interfejsima kao VAJ iznad. Rešenje je da se učini jedno od sledećeg:

  • Stavite putanju u xerces.jar (ili neki drugi DOM Level 2 interfejs) u varijablu 'com.ibm.ejs.sm.adminserver.classpath' u datoteci admin.config. Ovo se smešta u $WAS_ROOT$/bin pre svih drugih varijabli.
  • ili, ako pokrećete WAS $WAS_ROOT/bin/debug/adminserver.{bat|sh} dodajte red 'set WAS_CP=xerces.jar' (ili neki drugi DOM Level 2 interfejs) pre ostalih skupova WAS_CP naredbi.
  • ili dodajte JDOM na PUTANJU KLASA aplikacionog servera, koristeći ili admin.cfg datoteku ili administracionu konzolu.

(Doprineo Guy Nirpaz)

Koja JDOM verzija radi sa kojom JDK?

JDOM 1.x verzije podržavaju JDK 1,2 i novije

JDOM 2.x verzije podržavaju JDK 1,5 i novije.

Postoje li brojevi performansi?

Proces razvoja JDOM 2.x uključuje merila za praćenje promena performansi. Postoje brojevi performanse koji upoređuju različite verzije JDOM 2.x kao što porede performnse JDOM na različitim JDK verzijama.

Dennis Sosnoski je u prošlosti vodio merenja performansi. U principu, većina XML modela objekata je u sličnom susedstvu.

Kako se JDOM integriše sa XSLT?

TPostoji mnogo načina da transformišete XSL sa JDOM. Najjednostavniji način je da koristite standardni JAXP Transformer interfejs i JDOMSource/JDOMResult klase koje se nalaze u org.jdom2.transform paketu. Pogledajte za primer na uzorku nazvanom XSLTransform .

Postoji li XPath podrška u JDOM?

Da! Potpuno je integrisan u org.jdom2.xpath od Beta 9, na temelju Jaxen.

Kojim karakteristikama XML ne rukuje JDOM?

Ni jednom nama poznatom.

Da li je JDOM bezbedan za višenitni rad?

Osnovni API namerno nije bezbedan za višenitni rad. Drugim rečima, ne postoje sinhronizovani blokovi unutar org.jdom. Ova odluka ima smisla, jer očekujemo da će primarni slučajevi korišćenja JDOM biti:

  • Jedna nit učitava XML tok podataka u JDOM i posmatra ga kao samo za čitanje
  • Jedna nit učitava XML tok podataka u JDOM i modifikuje ih
  • Jedna nit učitava XML tok podataka u JDOM i čini ih dostupnim izvršnom sistemu za read only pristup.

Slučaj gde "Jedna nit učitava XML tok podataka u JDOM i izlaže više niti da bi promenili njegov sadržaj" je prilično redak. U tom slučaju, JDOM još uvek može biti bezbedan za višenitni rad, ali programer jednostavno mora obavljati svoju sinhronizaciju, možda kao sinhronizovanje dokumenta na primer.

S druge strane, postoje određene funkcije koje zahtevaju da 'operativni' delovi JDOM budu bezbedni za višenitni rad

  • org.jdom2.Namespace.getNamespace() je siguran
  • Sve klase fabričkog tipa su sigurne (XPathFactory, itd.)

Zašto equals() jedino radi a == check?

U JDOM dva objekta Sadržaja su ravnopravni jedino, ako oni isti objekat. To omogućava da poziv kao list.remove(elem) ukloni samo određeni Elemenat koji je prosleđen, a ne bilo koji elemenat koji je ekvivalent. Ovo je vrlo važna razlika. Radeći celo equals()na elementu zahtevaće ponavljanje niz stablo, i generalno verujemo da ćete verovatno želeti da znate jesu li ovaj elemenat i svi njegovi potomci ekvivalentni nekom drugom. Ako stvarno želite da znate možete napisati neki kod za upoređivanje koji će da proverava samo onoliko koliko želite proveriti (možda ime/imenski prostor samo) umesto da radite kompletno ponavljanje.

Zašto je equals() proglašeno završnim?

equals() equals()metode su završne za JDOM Content klase, tako da podrazred ne može pokvariti == ponašanje koje je potrebno za pozive poput list.remove(elem) a bi radili kao što je dizajnirano. Isto tako hashCode() metode su takođe završne (da bi očuvale equals/hashCode ugovor).

Kako izgraditi dokument od Niza Znakova?

Koristite standardna Java IO pozivanja datoteke. Zamotajte String sa StringReader i prosledite čitač na SAXBuilder:

Document doc = builder.build(new StringReader(xml));

Kako mogu ukloniti Elemenat ili drugi sadržaj?

Koristite metode na Listi koje su rezultat getChildren() ili getContent(). DOM ne zahteva posebne metode, jer metode već postoje na Listi. Na primer a bi uklonili elemenat sa liste potomaka:

List children = parent.getChildren();
children.remove(element); // given child
children.remove(0);       // first child

Druge metode na listi pružaju mogućnosti za uklanjanje svih potomaka, dodavanje potomka na određenoj lokaciji, i tako dalje.

Ako imate određeni Elemenat ili neki drugi Sadržaj kojem želite ukloniti njegovog roditelja, možete odvojiti Sadržaj sa Content.detach () metodom.

Kako premestiti Elemenat sa jednog mesta na drugo?

Nema potrebe za čvorom "importing" kao što je slučaj sa DOM. Samo treba ukloniti elemenat iz svog sadašnjeg mesta, zatim dodati elemenat na njegovo novo mesto. Sadržaj elementa (uključujući i njegove potomke elemenata) će se naravno prišljamčiti. Morate ukloniti elemenat pre njegovog dodavanja na novo mesto, jer elementi mogu imati samo jednog roditelja kao rezultat getParent().

newParent.addContent(elt.detach());

Kako mogu kopirati element sa jednog mesta na drugo?

Nema potrebe za čvorom "importing" kao što je slučaj sa DOM. Samo klonirajte elemenat koji je kopiran i dodajte njegov ​​klonna njegovo novo mesto. Morate klonirati elemenat pre njegovog dodavanja na novo mesto, jer elementi mogu imati samo jednog roditelja kao rezultat getParent().

newParent.addContent(elt.clone());

Može li naziv elementa ili atributa da sadrži dve tačke?

Specifikacija XML 1,0 posebno rezerviše karakter sa dve tačke za korištenje sa XML Namespace. Ni jedna druga upotreba nije u skladu sa XML 1.0. Stoga JDOM ne dopušta da kreirate ime elementa ili atributa koji sadrže dvotačke osim kada koristite imenski prostor. Nadalje, zbog načina na koji su imenski prostori implementirani u JDOM, ne možete jednostavno stvoriti Elemenat ili Atribut sa potpuno kvalifikovanim imenom kao svg:title. Zbog toga ne možete da uradite ovo:

Element e = new Element("svg:title");

Umesto toga morate podeliti dva dela na Namespace i lokalni naziv. To je pravi JDOM način da kreirate element u namespace:

Element e = 
  new Element("title", "svg", "http://www.w3.org/2000/svg");

Prvi argument je lokalni naziv. Drugi argument je prefiks. Treći argument je namespace URI.

Ako pokušavate da kreirate xml:lang i xml:space atribute koristite:

Element e = 
  new Element("lang", Namespace.XML_NAMESPACE);

Zašto moram da prenesem Namespace na getChild(), kada potomak elementa koji tražim nema namespace deklaraciju?

Posebno, za ovaj XML fragment:

<x>
  <y xmlns="http://foo.com">
    <z />
  </y>
</x>

Morate koristiti kod poput ovog

Namespace ns = Namespace.getNamespace("http://foo.com");
Element y = x.getChild("y", ns);
Element z = y.getChild("z", ns);

 

Ako izostavim imenski prostor iz drugog poziva na getChild (), rezultat je prazan znak.Zašto?

JDOM radi na logičkoj memoriji XML stabla, a ne tekstualnoj reprezentaciji na disku. Dok elemenat z nema deklaraciju imenskog prostora,on ima imenski prostor - onaj nasleđen od svojih roditelja, koji deklariše osnovni imenski prostor (povezano sa URI http://foo.com).

Prema specifikaciji imenskog prostora, sledeći XML fragment je identičan po značenju sa prethodnim:

<x>
  <y xmlns="http://foo.com">
    <z xmlns="http://foo.com" />
  </y>
</x>

Način na koji JDOM API rukuje imenskim prostorom znači da možete napisati kod koji radi na oba primera. Inače, trebalo bi da imate kod koji proverava za svaki slučaj zasebno.

Isto tako, ako izgrađujete (umesto čitanja) XML kao u prvom primeru gore,trebalo bi da napišete kod:

Namespace ns = Namespace.getNamespace("http://foo.com");
Element y = new Element("y", ns);
x.addContent(y);
Element z = new Element("z", ns);
y.addContent(z);
Ako izostavite namespace instancu iz konstruktora za elemenat z,trebalo bi da imate sledeće stablo u memoriji:
<x>
  <y xmlns="http://foo.com">
    <z xmlns="" />
  </y>
</z>

Zašto se svi novi redovi pojavljuju kao \n, čak i na Windows-u?

Prema odeljku 2,11 u XML Preporuka, 2 izdanje.

Da bi pojednostavili zadatke aplikacija , XML procesor mora normalizovati prelome redova u raščlanjenim entitetima na #xA bilo prevođenjem dvoznačnog niza #xD #xA i bilo kog #xD koji nije praćen #xA to #xA na ulazu pre parsiranja, ili pomoću neke druge metode takve da su karakteri preneti na aplikaciju isti kao i da je urađeno ovo prevođenje.

Drugim rečima, to je tačno ono što bi trebalo da se dogodi.

Neki XML ulaz može izbeći \r znak za početak reda kao i XML parser će prevesti to u pravi \ r karakter u vašem JDOM Tekstu. Kada se ovaj Tekst štampa ponovo izaći će ponovo kao .

Zašto setText(" ") ne radi ono što želim?

Kada proslediteniz metodom poput setText() JDOM pretpostavlja da je upravo to, niz, a ne fragment XML. Na primer, kada pozovete:

element.setText("&#160;")

DOM pretpostavlja da želite da postavite sadržaj na niz koji sadrži šest znakova & # 1 6 0 ; Ne analizira ga pokušavajući da ga shvati kao XML prvo. Dakle, kada šaljete na izlaz tekst koristeći XMLOutputter on će naravno izbeći poseban ampersand karakter i izlaz  .Rešenje je da prosledite regularne Unicode znakove setText () metodom ili, ako imate tekstualne podatke koje želite da se tumače kao XML, provedete kroz XML parser pre nego što odu u JDOM. To je ono što SAXBuilder i DOMBuilder klase rade.

Kada koristim IDE debugger zašto vidim čudan ArrayIndexOutOfBoundsException?

Neki parseri (uključujući Xerces) koristite ovaj izuzetak kao deo svog standardnog operativnog postupka, interno pravljenjem i hvatanjem izuzetka. Ni jedan kod izvan datoteke mislim da nije viđen. Međutim, IDE debuggers često su konfigurisani da prijave kad god se napravi ovaj izuzetak, a time i oni izlažu taj izuzetak. To može biti bezbedno ignorisano.

Kako da dodam PI ili Komentar pre korenskog elementa??

Morate pristupiti sadržaju dokumenta kao Listi.Ili nabavite listu i dodajte sadržaj na njegovo zaglavlje, ili postavite listu sadržaja eksplicitno.

doc.getContent().add(0, pi);
ili
doc.setContent(listOfContent);

Kako da izbegnem OutOfMemoryError?

Većina JVMs ima mogućnost da povećava svoju maksimalnu veličinu dinamičke memorije, što je najveći iznos memorije koji JVM može koristiti za svoje objekte. Možete postaviti svoju ​​početni veličinu dinamičke memorije na 32 Megs i maksimalnu veličinu dinamičke memorije na 64 Megs sledećom naredbom:

java -Xms32m -Xmx64m SomeClass

Ako se ne zahteva ceo dokument u memoriji, pogledajte na jdom-contrib module's org.jdom.contrib.input.scanner paketu koji vam omogućava da izradite deo dokumenta koji odgovara XPath izrazu.

Zašto moje kodiranje datoteke na izlazu ne odgovara kodiranju na ulazu?

Osnovno kodiranje znakova koje koristi XMLOutputter je UTF-8, kodiranje promenljivih dužina koje može predstavljati sve Unicode znakove. Ovo može biti promenjeno pozivanjem format.setEncoding() na Format objekta koji je prenet na XMLOutputter.Bilo bi lepo ako bi XMLOutputter podrazumevao izvorno kodiranje za datoteku, ali nažalost parseri ne indiciraju izvorno kodiranje. Morate ga postaviti programiranjem.

Ovo pitanje najčešće pogađa ljude s dokumentima sa uobičajenim ISO-8859-1 (Latin-1) kodiranjem koje koristi karaktere poput ñ, ali nisu upoznati sa razmišljanjem o kodiranju. Savet je da zapamtite da sa tim dokumentima morate postaviti izlazno kodiranje na ISO-8859-1, inače karakterii u rasponu 128-255 će izaći pomoću dvobajtnog kodiranja u UTF-8 umesto normalnog jednobajtnog kodiranja ISO-8859-1.

Zašto prolazi dokument kroz utičnice ponekad objesiti parser?

Problem je u tome što nekoliko XML parsera zatvara ulazni tok kada učitavaju EOF (-1). To je tačno Xerces, koji je osnovni JDOM parser. To je takođe istina i za Crimson. Nažalost, zatvaranjeSocketInputStream zatvara temeljni SocketImpl,postavljajući deskriptor datoteke na prazan znak.Izlazni tok priključka je beskorisan nakon toga, tako da vaša aplikacija neće biti u mogućnosti da pošalje odgovor.Da bi ovo rešili, zaštitite ulazni tok vašeg priključka s InputStream omotačkim programom koji ne zatvara temeljni tok (zanemaruje close() metodu), ili učitajte sve u međumemoriju pre predaje JDOM graditelju:

byte[] buf = new byte[length];
new DataInputStream(inputStream).readFully(buf);
InputStream in = new ByteArrayInputStream(buf);
(Doprinos Joseph Bowbeer-a)

Kako da zadržim DTD od učitavanja? Čak i kad isključim proveru parser pokušava da učita DTD datoteku.

Čak i kada je validacija isključena, XML parser će po defaultu učitati eksternu DTD datoteku kako bi se analizirao DTD za eksternu entitetsku deklaraciju. Xerces ima mogućnost da isključi takvo ponašanje pod nazivom "http://apache.org/xml/features/nonvalidating/load-external-dtd" i ako znate da koristite Xerces možete podesiti ovu karakteristiku na graditelju.

builder.setFeature(
  "http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Ako koristite drugi parser poput Crimson, vaš najbolji ulog je da podesite EntityResolver da rešava DTD bez učitavanja zasebno datoteka.

import org.xml.sax.*;
import java.io.*;
public class NoOpEntityResolver implements EntityResolver {
  public InputSource resolveEntity(String publicId, String systemId) {
    return new InputSource(new StringBufferInputStream(""));
  }
}

Zatim u graditelju ...

builder.setEntityResolver(new NoOpEntityResolver());

Postoji druga strana ovog pristupa. Bilo koji entitet u dokumentu će biti rešen do praznog znakovnog niza, te će efektno nestati. Ako vaš dokument ima entitete, trebate da podesite ExpandEntities(false) kod i osigurate da EntityResolver samo potiskuje DocType.

Kako potvrditi nasuprot šemi kada da koristite JDOM 2.x?

JDOM 2.x uvodi pojednostavljeni model za vrednovanje dokumenta. org.jdom2.input.sax.XMLReaders Enum sadrži članove koji podešavaju proveru za vas.

Kompletan kod u JDOM 2.x izgleda ovako:

SAXBuilder builder =
  new SAXBuilder(XMLReaders.XSDVALIDATING);
Document doc = builder.build(xml);

Kako potvrditi nasuprot šemi kada da koristite JDOM 1.x?

JDOM 1.x nema vlastiti parser, koristi standardne parsere poput Xercesda obave teško podizanje. Ako želite proveru valjanosti šeme postarajte se da odaberete parser koji podržava šeme. Xerces 2 je dobar izbor (nabavite na http://xml.apache.org). Takođe je potrebno da koristite kod JDOM Beta 8 ili noviji.

Za određivanje parsera koji JDOM koristi, možete ili odgovarajuće konfigurisati JAXP (pošto JDOM koristi JAXP ako je dostupan, vidi kraj ovog unosa za detalje) ili možete eksplicitno preneti ime parsera na SAXBuilder konstruktor. Za Xerces 2 parser klasa org.apache.xerces.parsers.SAXParser. Morate takođe omogućiti proveru parsera prosleđujući "true" kada kreirate SAXBuilder.

SAXBuilder builder =
  new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);

Zatim , kažete parseru (Xerces) da želite da proverite protiv šeme (ili šema), i prosledite parseru informacije o tim šemama. Različiti parseri to rade na različite načine. U Xerces to činite postavljanjem posebnih ''karakteristika i 'svojstava' parsera. JDOM izlaže ove postavke parsera sa setFeature () i setProperty () metodama na SAXBuilder. Ove prolazne metode su dodate nakon Beta 7, što je razlog zašto vam je potrebnan Beta 8 ili noviji.

Šeme su omogućene podešavanjem karakteristike "http://apache.org/xml/features/validation/schema" na true.

builder.setFeature(
 
"http://apache.org/xml/features/validation/schema", true);

Lokacije šema dobijaju se podešavanjem svojstava "http://apache.org/xml/properties/schema/external-schemaLocation" na spisku razmakom odvojenih name-value parova. 'ime' je imenski prostor sa kojim je Šema povezana, 'vrednost' je mesto sheme za tajimenski prostor. Na primer:

builder.setProperty(
 
"http://apache.org/xml/properties/schema/external-schemaLocation",   "http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + " " +   "http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");

Navedeni primer pokazuje kako potvrditi protiv više šemam - protiv SOAP 1,2 šeme gde je imenski prostor http://www.w3.org/2001/12/soap-envelope a i protiv sheme za imenski prostor http ://kevinj.develop.com/blog/weblog.xsd. Datoteke koje opisuju ove šeme su usoap-envelope.xsd i weblog.xsd respektivno. Možete prema potrebi dodati koliko želite name value parova. Vrednosti su same URL-ovi. Imena vrednosnih parova sledei značenje dato u preporuci Šema (http://www.w3.org/TR/xmlschema-1/#schema-loc ).

Kompletan kod izgleda ovako:

SAXBuilder builder =
  new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
builder.setFeature(
  "http://apache.org/xml/features/validation/schema", true);
builder.setProperty(
  "http://apache.org/xml/properties/schema/external-schemaLocation",
  "http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + " " +
  "http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");
Document doc = builder.build(xml);

Ako želite da koristite JAXP za odabir parsera, možete preskočiti navođenje klase na SAXBuilder konstruktoru i umesto toga podesiti svojstvo sistema "javax.xml.parsers.SAXParserFactory" na vrednost "org.apache.xerces.jaxp.SAXParserFactoryImpl". To govori JAXP da koristiti Xerces-ov obrazac projektovanja za izgradnju parsera. Ako vam se sviđa, možete navesti ovo svojstvo na komandnoj liniji:

java -Djavax.xml.parsers.SAXParserFactory=
          org.apache.xerces.jaxp.SAXParserFactoryImpl ...

(Doprinos Kevin Jones-a)

Kako mogu izvesti proveru memorije nasuprot DTD ili Šemi?

Trenutno ne možete to učiniti, u JDOM ili bilo kom drugom Java dokumentu Modela objekta API. Međutim, to je nešto što smo želeli da JDOM podržava, i mi imamo dobrovoljca koji radi na tome.

JDOM osigurava da je dokument u memoriji uvek dobro formiran. Može li JDOM takođe osigurati da je dokument u memoriji uvek validan?

Ne, naše sadašnje uvjerenje je da je bolje izlagati se checkValid () vrsti poziva nego pokušavati stalno proveravati ispravnost. Jedan od razloga je performansaa. Drugi razlog je da imate kokoška-i-jaje problem gde na primer elementu trebaju tačno dva potomka elementa da bi bio validan, ali nakon dodavanja bilo kog potomka dokument će biti privremeno u stanju nevaženja. Da biste ovo zaobišli to će zahtevati nešto poput transakcijskih izmena, i to je previše za mali dobitak.

Zašto ja dobijam IndexOutOfBoundsException ili ConcurrentModificationException na petlji

Kod poput sljedećeg će napraviti IndexOutOfBoundsException:

 List children = root.getChildren("foo");
 int size = children.size();
 for (int i = 0; i < size; i++) {
   Element child = (Element) children.get(i);
   child.detach();
   otherRoot.addContent(child);
 }

Razlog je da je veličina spiska unapred izračunata, ali veličina se smanjuje za jedan na svakom detach() pozivu, uzrokujući da se petlja premešta na kraj spiska. Pravi način da se napravi petlja je da koristite iteratora. Uz iteratora nemate taj problem,i takođe je brži.

Međutim, čak i sa iteratora, sledeći kod će napraviti IndexOutOfBoundsException:

 List children = root.getChildren("foo");
 Iterator itr = children.iterator();
 while (itr.hasNext()) {
   Element child = (Element) itr.next();
   child.detach();
   otherRoot.addContent(child);
 }

Razlog je u tome što detach() poziv menja spisak potomaka u isto vreme kada se iterator kreće kroz spisak, i to je istodobna modifikacija. Rešenje je da se koristi metoda iteratora remove() umesto detach() situaciji:

List children = root.getChildren("foo");
 Iterator itr = children.iterator();
 while (itr.hasNext()) {
   Element child = (Element) itr.next();
   itr.remove();
   otherRoot.addContent(child);
 }

Postoji li arhiva za JDOM lista slanja?

Da, sve poruke su dostupne za vašepregledanje zasnovano na web-u. Ispod su sve gledke za pretrazivanje ​​sve-u-jednom arhive:

Postoje dodatni arhivi na:

Kako da se odjavim sa liste slanja?

URL za upravljanje vašom listom članstva (uključujući i pretplatu) prikačen je na dnu svake poruke liste. To bi trebao da bude nešto poput http://www.jdom.org/mailman/options/jdom-interest/ youraddr@yourhost.com. Pobrinite se da zamenite "youraddr" sa svojom adresom i "yourhost" sa vašim domaćinom. Kod jdom-objave zamenite "interes" sa "announce" u URL-u.

Kako mogu da postavljam na mailing listu sa više adresa?

Zbog spam zaštite, samo članovi mailing liste mogu postavljati. Da biste postavljali sa više naloga, pretplatite svaki nalog i podeite "Disable mail delivery" karakteristiku na "on" za sve dodatne naloge. Možete da podesite tu karakterisitiku na URL-u navedenom u prethodnom odgovoru.

Treba li osnovna XML pitanja da postavljam Jasonu, Brett-u, ili Rolfa-u?

Ne, oni su zauzeti već dovoljno. Ali možete naručiti Brett-ovu knjiga Java i XML li neki od drugih XML uvodnih knjiga poput XML Biblije od Elliotte Rusty Harold-a (jedan od naših istaknutih jdom-interesnih članova liste).

Knjiga Java i XML govori o JDOM 1.0; Čemu zbunjenost?

Knjiga pokriva rano beta. Mnogo se toga promenilo (na bolje) od objavljivanja knjige. Za najtačniji JDOM API verujte Javadocs, a ne knjizi. Brett je bio malo optimističan kada je pisao knjigu. Njegovo drugo Izdanje ispravlja stvari.

Imam pitanje na koje nije odgovoreno ovde. Šta da radim?

Prvo, treba da pretražite ​​JDOM arhivu liste slanja. Na primer, ako koristite Oracle parser i vidite IllegalTargetExceptionkoje ne miriše na dobro, možete tražiti "Oracle IllegalTargetException" i naći ćete raspravu o tom pitanju. Peretrage su snažne i brze!

Ako ne možete pronaći odgovor u arhivi, možete postavljati na jdom-interest. Ako mislite da ste našli grešku, pobrinite se da sledite sledeći savet o podnošenju izveštaja o grešci!

Kako da podnesem izveštaj o grešci?

Ako smatrate da ste pronašli grešku u JDOM, molimo sledite ovu proceduru:

  1. Proverite oba i otvorena pitanja i zatvorena pitanja da vidite da li je to poznati problem.
  2. Proverite dali problem nastaje kada koristite najnoviju razvijenu verziju razvoja (source .zip) of JDOM.
  3. Pretražite JDOM arhivu liste slanja kao što je objašnjeno gore
  4. Ako ne možete da pronađete rešenje sa najnovijim snimkom, ili kreirajte pitanje na GitHub ili postavite na jdom-interest listu slanja;. proverite da li ste pretplatnik prvo jer samo pretplatnici mogu postavljati
  5. U izveštaju o grešci, dajte što je moguće više informacija - stanje šteka, ponovljive i kratkeprimere koda, XML datoteke koja uzrokuje probleme. Pobrinite se da navedete verziju JDOM koju ste koristile (zvanična verzija ili GitHub potvrda).
  6. Ako imate zakrpu da popravite grešku, molimo Vas da navedete to u izveštaju o problemu. Mi volimo zakrpe..

Gde mogu saznati više?

JDOM API dokumentaciju, slajdove iz početne JDOM objave, i druge korisne resurse možete preuzeti ovde.

 
Published (Last edited): 21-01-2013 , source: http://www.jdom.org/docs/faq.html