JDOM: Často kladené otázky

Source page: http://www.jdom.org/docs/faq.html

Co je JDOM?

JDOM je, prostě a jednoduše, Java reprezentace XML dokumentu. JDOM poskytuje způsob, jak reprezentovat tento dokument pro snadné a efektivní čtení, manipulace a psaní. To má jednoduché API, je lehký a rychlý, a je optimalizován pro programátora Java. Je to alternativa k DOM a SAX, i když to dobře integruje s oběma DOM a SAX.

Co je JDOM ne?

JDOM není obal pro W3C DOM, nebo jiná verze DOM. JDOM je „objektový model dokumentu“ Java-založený na XML soubory. JDOM slouží stejnému účelu jako DOM, ale je snadnější použití.

JDOM není XML parser, jako Xerces nebo Crimson. Jedná se o model objektu dokumentu, který používá XML analyzátory stavět dokumentů. JDOM je SAXBuilder třída například používá SAX události generované XML parser vybudovat JDOM strom. Výchozí XML parser použitý JDOM je JAXP vybrané parser, ale JDOM můžete použít téměř jakýkoliv parser.

Je JDOM zkratka?

Ani náhodou. Stejně jako JDBC není oficiálně zkratka, ani je JDOM. Tím je zajištěno, jsme v souladu se zásadami používání ochranných známek společnosti Sun, jak je vysvětleno v http://www.sun.com/policies/trademarks.

Co je to licence JDOM?

JDOM je dostupný pod Apache ve stylu open source licencí k, s klauzulí potvrzení odstraněn. Tato licence je mezi nejméně omezující licence k dispozici, umožňuje vývojářům používat JDOM při vytváření nových produktů, aniž by je bylo nutné uvolnit své vlastní produkty jako open source. Jedná se o model, licence používá Apache Project, který vytvořil server Apache. Licence je k dispozici v horní části každého zdrojového souboru a license.txt v kořenovém adresáři distribuce.

Kde mohu získat JDOM?

JDOM je k dispozici v binární i zdrojové formě z http://www.jdom.org.

JDOM je dostupný také v maven centrální ve skupině ‚org.jdom‘ s artefakty ID JDOM pro JDOM 1.x (av některých starších verzích 2.x): JDOM 1.x artefaktů na Maven, nebo s artefaktem ID jdom2 pro JDOM 2.x: JDOM 2.x Artefakty na Maven

Plné zdrojový kód úložiště je udržována na GitHub.

Který Maven artefakt mám použít?

Všechny verze JDOM jsou k dispozici v ‚JDOM‘ nebo ‚jdom2‘ artefaktu ve skupině org.jdom na Maven. The Maven artefakty jsou nepořádek s časnými verzemi 2.x JDOM uvedených v ‚JDOM‘ artefakty a novější verze 2.x v artefaktu “jdom2. Maven neumožňuje stanovení chyb, takže Maven uživatelé wil prostě muset žít s tím, jak to je.

Pokud váš projekt je ten, který vyžaduje jak JDOM 1.x i 2.x, můžete také použít ‚JDOM-dědictví‘ artefakt táhnout ve verzi 1.1.3 (nebo novější 1.x verze).

Jaký je JDOM filozofie?

JDOM byla a bude i nadále rozvíjet s touto filozofií:

  • JDOM by měl být jednoduchý pro Java programátory.
  • JDOM by měly podporovat snadnou a efektivní úpravu dokumentů.
  • JDOM by měl skrývat složitost XML je to možné, zatímco zůstane věrný specifikaci XML.
  • JDOM by měly integrovat s DOM a SAX.
  • JDOM by měla být lehká a rychlá.
  • JDOM měla vyřešit 80% (nebo více) problémů / XML v jazyce Java s 20% (nebo méně) intenzity

Proč je JDOM API je definováno v podmínkách konkrétních tříd, nikoli rozhraní?

Tato otázka byla projednána několikrát na mailing listu JDOM, s několika lidmi na obou stranách. Obecně platí, že mnoho lidí má pocit, že API třída bázi je lepší, když není potřeba subclassing, zatímco API rozhraní založené je lepší, když je potřeba subclassing. Nicméně, a to buď systém může být použit v obou případech.

Jason Hunter shrnuje argumenty proti API k rozhraní založené na JDOM:

S rozhraními vše se stává továrna, prvky musí být ‚dovezeny‘ do nových dokumentů namísto právě přidali, funkcemi, jako je dlouhodobý serializaci nelze zaručit, a seznam by mohl pokračovat dál.

Začali jsme s rozhraními vlastně. Během našeho pre-release přezkoumání některých vrstevníky jsme obdrželi zpětnou vazbu, měli bychom se pokusit konkrétní třídy. Udělali jsme, a design byl mnohem lepší.

Přemýšlet o tom, java.io.File jako analogie. Existuje důvod, proč říkáme:

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

rather than

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

První z nich je prostě jednodušší a hezčí řešit.

Dalším bodem třeba mít na paměti, že vše, co lze udělat s rozhraní lze provést subclassing – jediným trestem je možné nepoužívané proměnné v základní třídě.

Pro srovnání, poslední mailing list diskuse na toto téma začala 30. listopadu 2000 s „rozhraní“, a pokračoval s „JDOM rozhraní založené na“ a „oznamuje: JDOMPlus“. To by přispělo k přezkoumání této diskuse před podáním toto téma se na mailing listu.

Jak se JDOM pracovat s DOM a SAX?

Dokumenty JDOM mohou být postaveny z XML souborů, DOM stromy, SAX událostí, nebo jakéhokoli jiného zdroje. Dokumenty JDOM mohou být převedeny na XML soubory, DOM stromy, SAX událostí nebo jakékoliv jiné místo určení. Tato schopnost prokáže, užitečné, například při integraci s programem, který očekává SAX událostí. JDOM lze analyzovat XML soubor, nechte programátor snadno a efektivně manipulovat dokument, pak oheň SAX události do druhého programu přímo – žádný převod na serializovaném formátu je nutné.

Byl JDOM určen pro Generics?

JDOM byl navržen před Generics, ale JDOM 2.x převzala osvědčenou konstrukci JDOM 1.x a rozšířil jej na místo, kde je to možné použít Generics. Konkrétně operace sbírky založené na všechny vyžadují vhodně zadali vstupy, a vrátit se vhodně zadali výsledky. Dále JDOM 2.x využívá dalších funkcí Java 5 jako varargs, a co-variantní návratové typy.

Generika: Element.getAttributes () vrací seznam <Atribut> Element.getChildren () vrací List <prvek>, atd

Co-varianta Druhy Návrat: Element.clone () vrátí Element, Text.detach () vrací text, atd.

Snažil jsem se použít JDOM a dostanu chybu takto:

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

Co je špatně?

Musíte se ujistit, že soubor xerces.jar dodáván s JDOM stažení je v classpath před jakýmikoli jinými třídami XML, jako jsou ty, které přicházejí s JAXP nebo Crimson. Tyto další XML knihovny, stejně jako starší verze Apache Xerces, podporu DOM Level 1 a SAX 1.0, není nutná DOM Level 2 a SAX 2.0. Výsledkem je výjimka je hozen. Zkontrolujte, zda vaše classpath, a zkuste to znovu. V případě, že classpath vypadá OK, problematické JAR mohla být také skrývá ve standardním prodlužovacím adresáři systému (viz dále).

Co myslíš tím „Standardní adresář rozšíření“?

Standardní rozšíření adresář je adresář, který obsahuje soubory JAR, který je prohledávané automaticky runtime Java a kompilátor. Pokud jste nainstalovali sadu JDK (ne jen JRE) může také mít dva oddělené ext adresáře, z nichž jedna se používá pro sestavování (obvykle někde jako C: \ jdk1.3 \ jre \ lib \ ext) a druhá z nichž se používá pro spuštění kódu (typicky někde jako je C: \ Program Files \ JavaSoft \ jre \ 1.3 \ lib \ ext). Nesprávný JAR Soubor buď adresáři může dostat do cesty (i když v různých časech). Kromě toho je soubor pravým JAR musí být v obou adresářích.

Jak se lze vyhnout problému DOM Level 1 v Visual Age for Java?

Je-li funkce WTE přidána do pracovního prostoru, projekt ‚IBM XML parser pro Javu‘, která zní stejně. Tento projekt obsahuje staré DOM Level 1 ‘org.w3c. *’ Rozhraní. JDOM spoléhá na DOM Level 2, a proto conficts s ​​tímto projektem. Řešením je proveďte následující:

  1. Majitel změna pracovního prostoru, aby správce
  2. Vytvořit otevřený ročník projektu ‚IBM XML Parser pro Javu‘
  3. Odstranit všechny balíčky, které obsahují org.w3c. * Rozhraní
  4. Verze projektu.
  5. Vytvořte nový projekt pro DOM Level 2 parser jako Xerces
  6. Importovat všechny Xerces tříd včetně org.w3c. * Rozhraní (můžete použít kompletně odlišný projekt těchto rozhraní, pokud chcete pracovat s jinými analyzátory)
  7. VERZE Xerces projekt
  8. Vytvoření projektu JDOM a importovat JDOM třídy do něj. Verze projektu

(Přispěl Guy Nirpaz)

Jak se lze vyhnout problému DOM Level 1 v WebSphere?

WebSphere má stejný problém s DOM Level 1 rozhraní jako vaj výše. Řešením je provést jednu z následujících:

  • Dát cestu k xerces.jar (nebo jiné DOM Level 2 rozhraní) v proměnné ‚com.ibm.ejs.sm.adminserver.classpath‘ v souboru admin.config. To spočívá v $ WAS_ROOT $ / bin před všemi ostatními proměnnými.
  • nebo, pokud se dostanete byl $ WAS_ROOT / bin / debug / adminserver. {bat | sh} přidat řádek ‘nastavit WAS_CP = xerces.jar’ (nebo jiné DOM Level 2 rozhraní) před ostatními příkazy set WAS_CP.
  • nebo přidejte JDOM k serveru CLASSPATH aplikace, buď pomocí souboru admin.cfg nebo konzoly pro správu.

(Přispěl Guy Nirpaz)

Jaká verze JDOM pracuje s nimiž JDK?

JDOM 1.x verze podporují JDK 1.2 a novější.

JDOM 2.x verze podporují JDK 1.5 a novější.

Existují nějaké čísla výkonnosti?

Proces vývoje 2.x JDOM zahrnuta kritéria pro sledování změn výkonu. Tam jsou čísla výkonnosti srovnávající různé verze 2.x JDOM stejně jako srovnávající výkon JDOM na různých verzích JDK.

Dennis Sosnoski v minulosti běžel měřítek výkonnosti. Obecně lze říci, že většina objektů XML modely jsou v podobném sousedství.

Jak se JDOM integrovat XSLT?

Existuje mnoho způsobů, jak XSL transformuje s JDOM. Nejjednodušší způsob, jak je použít standardní rozhraní JAXP transformátor a tříd JDOMSource / JDOMResult nalezené v balíčku org.jdom2.transform. Podívejte se na vzorku s názvem XSLTransform pro příklad.

Je zde podpora XPath v JDOM?

Ano! Je plně integrován do org.jdom2.xpath jako Beta 9 na základě Jaxen.

Jaké vlastnosti XML nejsou zpracovány JDOM?

Žádné že víme.

Je JDOM vlákno v bezpečí?

Jádro API záměrně není závit bezpečné. Jinými slovy, nejsou synchronizované bloky v org.jdom. Toto rozhodnutí dává smysl, protože očekáváme, že základní případy použití JDOM být:

  • Jediná nit přečte proudu XML do JDOM a podívá se na to jen pro čtení
  • Jediná nit přečte proudu XML do JDOM a upravuje ji
  • Jediná nit přečte proudu XML do JDOM a dává je k dispozici k časovému systém běží pouze pro přístup k čtení

Použití případ, kdy „Single thread čte proudu XML do JDOM a vystavuje ji více vláken modifikovat jeho obsah“ je poměrně vzácný. V takovém případě JDOM může ještě být závit bezpečné, ale programátor prostě musí provádět vlastní synchronizace, snad jako synchronizaci v instanci dokumentu.

Na druhé straně, tam jsou některé funkce, které vyžadují ‚provozní‘ částí JDOM být závit bezpečné:

  • org.jdom2.Namespace.getNamespace () je bezpečná
  • Všechny třídy výroby typu jsou bezpečné (XPathFactory, atd.)

Proč se equal () pouze provést kontrolu ==?

V JDOM dvě obsahu objekty jsou pouze rovnat jestliže oni jsou přesně stejný objekt. To umožňuje volání jako list.remove (ELEM) odstraňovat pouze přesná Element prošel dovnitř, není žádný prvek, který je rovnocenný. Toto je velmi důležitý rozdíl. Dělá celých rovná () na prvku by vyžadovalo rekurzi ze stromu, a obecně jsme přesvědčeni, že nepravděpodobné, že budete chtít vědět, zda tento prvek a všechny její děti jsou rovnocenné s jinou. Pokud si opravdu chcete vědět, můžete napsat nějaký srovnávací kód sami, která kontroluje jen tolik, kolik chcete zkontrolovat (pouze možná Name / jmenných prostorů), místo toho dělal plné recurse.

Proč je equal () prohlášeny za konečné?

Equal se () metody jsou konečné pro výuku JDOM obsahu tak, že podtřída nemůže narušit chování ==, který je potřebný pro volání, jako je list.remove (ELEM) pracovat jako navržena. Stejně tak metody hashCode (), tak i konečné (zachovat se rovná / smlouvy hashCode).

Jak mohu postavit dokumentu z řetězce?

Používáte standardní Java IO knihovny volání. Zabalit řetězec s StringReader a předat čtenáři SAXBuilder:

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

Jak mohu odstranit prvek nebo jiný obsah?

Použijte metody v seznamu vrácené getChildren () nebo getContent (). JDOM nepotřebuje speciální metody, protože metody již existují v seznamu. Například odstranit prvek ze seznamu dětí:

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

Jiné metody na seznam poskytují možnosti k odstranění všech dětí, přidejte dítě v daném místě, a tak dále.

Máte-li konkrétní prvek nebo jiný obsah, který chcete odstranit ze své mateřské společnosti, můžete odpojit obsah pomocí metody Content.detach ().

Jak přesunout prvek z jednoho místa na druhé?

Není třeba pro uzel „import“, jako by se s DOM. Jen odstranit prvek z aktuálního místa, přidejte prvek do své nové místo. Obsah prvku (včetně jejích prvků dětí) se bude přirozeně „tag“ podél pro jízdu. Musíte odstranit prvek před přidáním do své nové místo, protože prvky mohou mít pouze jeden rodič vrácený GetParent ().

newParent.addContent(elt.detach());

Jak zkopírovat prvek z jednoho místa na druhé?

Není třeba pro uzel „import“, jako by se s DOM. Jen klon prvek je kopírován a přidat svůj klon ve svém novém místě. Máte klonovat prvek před přidáním do své nové místo, protože prvky mohou mít pouze jeden rodič vrácený GetParent ().

newParent.addContent(elt.clone());

Může prvek nebo atribut název obsahovat dvojtečku?

Specifikace XML 1.0 výslovně vyhrazuje znak dvojtečky pro použití s XML názvů. Žádné jiné použití je kompatibilní s XML 1.0. Proto JDOM neumožňuje vytvářet názvy prvků a atributů, které obsahují dvojtečky kromě při používání jmenných prostorů. Kromě toho, vzhledem ke způsobu jmenné prostory jsou implementovány v JDOM, nelze jednoduše vytvořit prvek nebo atribut s plně kvalifikovaný název, jako je SVG: názvu. To nemůžeš udělat toto:

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

Místo toho je nutné rozdělit na dvě části do aktuálního jmenného prostoru a lokálním jménem. Toto je správný způsob, jak vytvořit JDOM prvek v oboru názvů:

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

Prvním argumentem je místní název. Druhý argument je prefix. Třetí argument je jmenný prostor URI.

Pokud se snažíte vytvořit XML: lang a xml: atributy prostor použít:

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

Proč musím projít v oboru názvů getChild (), když dítě element Sháním nemá žádnou deklaraci jmenného prostoru?

Konkrétně, pro tento XML fragment:

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

Je třeba použít kód, jako je toto:

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

Nechá-li se mimo jmenný prostor z druhého volání getChild (), vrátí null. Proč?

JDOM pracuje na logické v paměti XML stromu, ne textová reprezentace na disku. Zatímco element z nemá žádnou deklaraci jmenného prostoru, to přece má jmenný prostor – ten zdědil po své mateřské společnosti, která prohlašuje výchozí jmenný prostor (spojené s URI http://foo.com).

Podle specifikace oboru názvů, následující fragment XML je totožný ve významu k předchozí:

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

Způsob, jakým JDOM API zpracovává jmenných prostorů znamená, že můžete psát kód, který pracuje pro oba příklady. V opačném případě budete muset mít kód, který kontroluje pro každý případ zvlášť.

Stejně tak, pokud jste stavěli (namísto čtení) XML v prvním výše uvedeném příkladu, budete muset psát kód takto:

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);

Pokud jste vynechal instance Namespace z konstruktoru prvku Z, měli byste mít následující strom v paměti:

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

Proč všechny nové řádky se zobrazí jako \ n, a to i na Windows?

Podle § 2.11 doporučení XML, 2. vydání:

Pro zjednodušení úkolů aplikací, Procesor XML musí normalizovat řádků v analyzovaných subjektů v #xA buď překladu sekvence dvou znaků #xD #xA a jakýkoli #xD že nenásleduje #xA na #xA na vstupu před analýze nebo pomocí jiné metody, takže znaky předány žádosti jsou stejné, jako kdyby to udělal tento překlad.

Jinými slovy, to je přesně to, co se má stát.

Některé vstupní XML může uniknout návrat vozíku \ r jako & # xD; a XML parser bude překládat to do pravého \ r znaku ve svém JDOM text. Když tento text je opět výstup bude opět unikl jako & # xD;.

Proč setText (“&#160;„) není dělat, co chci?

Při předání řetězec do metody jako setText () JDOM předpokládá, že je to jen to, že řetězec, nikoli fragment XML. Například při volání:

element.setText("&#160;")

DOM předpokládá, že chcete nastavit obsah na řetězec, který obsahuje šest znaků & # 1 6 0;. To není analyzovat to, aby se pokusili pochopit to jako XML jako první. Tak se při výstupu textu pomocí XMLOutputter bude přirozeně uniknout speciální znak ampersand a výstup & amp; # 160 ;. Řešením je předat pravidelné znaky Unicode metody setText () nebo pokud máte textových dat, které chcete být interpretována jako XML, předat jej pomocí XML parser, než přejde do JDOM. To je to, co tříd SAXBuilder a DOMBuilder dělat.

Při použití IDE debugger Proč vidím podivné ArrayIndexOutOfBoundsException?

Některé analyzátory (Xerces součástí dodávky) použít tuto výjimku jako součást jejich standardní operační postup, vnitřně házení a chytání výjimku. Žádný kód mimo knihovnu je třeba vidět. Nicméně debuggers IDE jsou často nakonfigurovány hlásit kdykoliv tato výjimka, a tak vystavit výjimku. To může být bezpečně ignorována.

Jak přidám PI nebo komentář před kořenovým elementem?

Musíte přístup k obsahu dokumentu jako seznam. Buď získat seznam a přidávat obsah do jeho hlavy, nebo nastavit seznam obsahu explicitně.

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

Jak se lze vyhnout získání OutOfMemoryError?

Většina JVM mají možnost zvýšit svou maximální velikost haldy, což je maximální množství paměti JVM lze použít pro své objekty. Můžete nastavit výchozí velikost haldy 32 mega a maximální velikosti haldy na 64 mega s následujícím příkazem:

java -Xms32m -Xmx64m SomeClass

Pokud si nevyžadují celý dokument v paměti, podívat se na org.jdom.contrib.input.scanner balíčku JDOM-contrib modulu, který umožňuje vybudovat část dokumentu odpovídající výraz XPath.

Proč můj kódování souboru na výstupu neodpovídá kódování na vstupu?

Výchozí kódování znaků použité XMLOutputter je UTF-8, je kódování s proměnnou délkou, které mohou reprezentovat všechny znaky Unicode. To lze změnit pomocí volání format.setEncoding () na objektu Formát předán XMLOutputter. Bylo by hezké, kdyby mohl XMLOutputter výchozí původní kódování pro soubor, ale bohužel analyzátory nenaznačují původní kódování. Budete muset nastavit programově.

Tento problém se nejčastěji postihuje lidi s dokumenty ve společném ISO-8859-1 kódování (Latin-1), kteří používají znaky, jako N, ale nejsou obeznámeni s tím přemýšlet o kódování. Špička na paměti, že s těmito dokumenty je třeba nastavit výstupní kódování ISO-8859-1, jinak znaky v rozmezí 128-255 bude výstup pomocí dvojitého kódování bajt UTF-8 namísto obvyklého jednoho bajtu kódování ISO-8859-1.

Proč předávání dokumentů prostřednictvím zásuvky někdy viset analyzátor?

Problém je v tom, že několik XML analyzátory uzavřít vstupní proud, když čtou OSZ (-1). To platí Xerces, což je JDOM své výchozí parser. To platí i pro Crimson. Bohužel, zavírání SocketInputStream zavře podkladové SocketImpl, nastavení deskriptor souboru na hodnotu null. Zásuvky s výstupním proudem je po této zbytečné, aby vaše žádost bude schopen odeslat odpověď. K řešení chránit vstupní proud vašeho hrdla s InputStream obalu, která není ukončena základní proud (přepsat metody close ()), nebo si přečíst všechno, co do vyrovnávací paměti před předáním do stavitel JDOM:

byte[] buf = new byte[length];
new DataInputStream(inputStream).readFully(buf);
InputStream in = new ByteArrayInputStream(buf);

(Přispěl Joseph Bowbeer)

Jak zajistím, aby DTD načítání? Dokonce i když vypnu ověření analyzátor pokusí načíst soubor DTD.

I když je validace vypnuta, bude XML parser implicitně načíst externí DTD soubor s cílem analyzovat DTD pro externí prohlášení entity. Xerces má funkci vypnout toto chování s názvem „http://apache.org/xml/features/nonvalidating/load-external-dtd“ a pokud víte, že používáte Xerces můžete nastavit tuto funkci na stavitele.

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

Pokud používáte jiný parser jako purpur, je nejlepší nastavit EntityResolver která řeší DTD, aniž by ve skutečnosti čtení samostatný soubor.

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

Pak v stavitele …

builder.setEntityResolver(new NoOpEntityResolver());

Tam je Nevýhodou tohoto přístupu. Veškeré subjekty v dokumentu budou vyřešeny na prázdný řetězec, a bude účinně zmizí. Pokud váš dokument obsahuje entity, je třeba setExpandEntities (false) kód a ujistěte se, že EntityResolver potlačuje pouze DocType.

Jak ověřím proti schématu při použití JDOM 2.x?

JDOM 2.x zavádí zjednodušený model pro ověřování dokumentů. Org.jdom2.input.sax.XMLReaders Enum obsahuje členy, které zřídila svou ověření za vás.

Kompletní kód JDOM 2.x vypadá takto:

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

Jak ověřím proti schématu při použití JDOM 1.x?

JDOM 1.x nemá svůj vlastní parser, používá standardní analyzátory jako Xerces dělat těžkou práci. Pokud chcete, ověření schématu ujistit, si vyberete parser, který podporuje schémata. Xerces 2 je dobrá volba (dostat to z http://xml.apache.org). Také je třeba použít kód JDOM Beta 8 nebo novější.

Chcete-li určit analyzátor JDOM používá, můžete buď nastavit JAXP odpovídajícím způsobem (protože JDOM používá JAXP pokud je k dispozici, najdete na konci tohoto vstupu podrobnosti) nebo můžete explicitně předat název analyzátoru do SAXBuilder konstruktoru. Pro Xerces 2. třídu parser je org.apache.xerces.parsers.SAXParser. Také je třeba povolit ověřování parser předáním „true“ při vytváření SAXBuilder.

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

Dále řeknete analyzátor (Xerces), který chcete ověřit proti schématu (nebo schémata), a předat informace o těchto parser schématu. Různé analyzátory to různými způsoby. V Xerces učiníte nastavením speciální ‚funkce‘ a ‚vlastnosti‘ z analyzátoru. JDOM vystavuje toto nastavení parser s setFeature () a metodách setProperty () na SAXBuilder. Přidá se tyto metody Průchozí po Beta 7, což je důvod, proč je potřeba Beta 8 nebo vyšší.

Schémata jsou povoleny nastavením funkce „http://apache.org/xml/features/validation/schema“ na hodnotu true.

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

lokace schématu jsou dány nastavením vlastnosti „http://apache.org/xml/properties/schema/external-schemaLocation“ do seznamu párů bílé znaky oddělené název-hodnota. Dále jen ‚jméno‘ je obor názvů schématu je spojena s, dále jen ‚hodnota‘ je umístění schématu pro daný obor názvů. Například:

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");

Výše uvedený příklad ukazuje, jak lze ověřit před několika schémat – proti SOAP 1.2 schéma, kde je namespace je http://www.w3.org/2001/12/soap-envelope a i proti schématu jmenného prostoru http: // kevinj.develop.com/weblog/weblog.xsd. Soubory popisující těchto schémat jsou v mýdlové envelope.xsd a weblog.xsd resp. Můžete přidat tolik, kolik z těchto dvojic název hodnota podle potřeby. Samotné hodnoty jsou adresy URL. Dvojice název hodnota následovat stejný význam jako v doporučení schématu (http://www.w3.org/TR/xmlschema-1/#schema-loc).

Kompletní kód vypadá takto:

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);

Chcete-li použít JAXP vybrat analyzátor, můžete přeskočit zadáním třídu do SAXBuilder konstruktoru a místo toho nastavit systémovou vlastnost „javax.xml.parsers.SAXParserFactory“ na hodnotu „org.apache.xerces.jaxp.SAXParserFactoryImpl“ , Který říká JAXP používat továrnu Xerces’ stavět analyzátory. Pokud chcete, můžete určit tuto vlastnost na příkazovém řádku:

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

(Příspěvek od Kevin Jones)

Jak mohu provést ověření v paměti proti DTD nebo schématu?

V současné době není možné to provést v JDOM nebo jakékoliv jiné Java dokumentu objektový model API. Nicméně, toto je něco, co bychom chtěli JDOM podpořit, a máme dobrovolníky, kteří se na tom pracuje.

JDOM zajišťuje, že dokument v paměti je vždy dobře tvarované. Může JDOM také zajistit, že dokument v paměti je vždy platné?

Ne, je to naše současná víra, že je lepší vystavit typ checkValid () hovoru, než se pokusit kontrolu konstantní ověření. Jedním z důvodů je výkon. Druhým důvodem je to, že máte nějaký problém slepice a vejce, kde například potřebuje přesně dva podřízené elementy být platný prvek, ale po přidání buď dítě dokument bude dočasně neplatném stavu. Chcete-li tento problém vyřešit by vyžadovala něco jako transakční úprav, a to je hodně nad hlavou pro malého zisku.

Proč získám IndexOutOfBoundsException nebo ConcurrentModificationException na opakování?

Kód jako následující se bude hodit 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);
 }

Důvodem je skutečnost, že velikost seznamu je pre-vypočtena ale velikost je snížena o jednu na každé detach () volání, příčinou pro smyčce odejít na konec seznamu. Správný způsob, jak se smyčka je použít iterátor. S Iterátor nemáte tento problém, a je to rychlejší stejně.

Nicméně, dokonce s Iterátor následující kód hází ConcurrentModificationException:

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

Důvodem je to, že detach () volání upravuje seznam dětí současně iterační se přechází přes seznam, a je to souběžné modifikace. Řešením je místo toho použít iterátor má odebrat () způsob detach () v této situaci:

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

Existuje archiv pro e-mailové konference JDOM?

Ano, všechny tyto zprávy jsou k dispozici pro váš web-based zjištění. Níže jsou kluzké vyhledávat all-in-one archivy:

Existují další archivy na adrese:

Jak se mohu odhlásit z mailing listu?

Adresa URL pro správu vašeho seznamu členů (včetně předplatného) je upevněn v dolní části každého seznamu zpráv. Mělo by to být něco jako http://www.jdom.org/mailman/options/jdom-interest/ youraddr@yourhost.com. Ujistěte se, že nahradit „youraddr“ s vaší adresou a „yourhost“ se svým hostitelem. Pro JDOM-announce nahradit pojem „zájem“ s „oznámit“ v URL.

Jak vložím do konference z více adres?

Pro ochranu proti spamu, tak členové mailing listu zveřejnit. Pro přidání z více účtů, předplatit každý účet a nastavte funkci „Zakázat doručení pošty“ na „ON“ pro všechny extra účtů. Můžete nastavit tuto vlastnost na URL uvedené v předchozí odpovědi.

Měl bych se zeptat na obecné otázky XML Jason Brett nebo Rolf?

Ne, to už dost práce. Ale můžete si objednat Brett knihu Java a XML, nebo některý z dalších XML úvodních knihách jako XML bible Elliotte Rusty Harold (jeden z našich předních členů JDOM zainteresovanosti seznam).

Kniha Java a XML hovoří o JDOM 1,0; proč zmatek?

Kniha pokrývá časnou beta. Mnohé změnilo (k lepšímu) od vydání knihy. Nejpřesnější JDOM API důvěřovat javadocs, je tato kniha. Brett byl trochu optimističtější při psaní knihy. Jeho 2nd Edition sady věci rovně.

Mám dotaz, který zde není zodpovězen. Co mám dělat?

Za prvé, měli byste hledat JDOM archivy konferencí. Například v případě, že používáte analyzátor Oracle a vidět IllegalTargetException který voní rybí, můžete hledat „Oracle IllegalTargetException“ a najdete diskuzi o této otázce. Tyto prohlídky jsou silné a rychlé!

Pokud nemáte najít odpověď v archivu, můžete psát na JDOM zájmu. Pokud si myslíte, že jste našli chybu, ujistěte se, že budete postupovat podle následující rady o hlášení chyb!

Jak mohu odeslat zprávu o chybě?

Pokud jste přesvědčeni, že jste našli chybu v JDOM, prosím, postupujte takto:

  1. Zkontrolujte oba otevřené otázky a uzavřené otázky, aby zjistil, zda se jedná o známý problém.
  2. Zkontrolujte, zda k problému dochází při použití nejnovější vývojovou verzi (zdroj ZIP) a JDOM.
  3. Vyhledávat JDOM archivy konferencí, jak je vysvětleno výše.
  4. Pokud nechcete najít řešení s nejnovější snímek, a to buď vytvořit problém na GitHub, nebo poštou na e-mailové konference JDOM-úrokové sazby; ujistěte se, že jste si účastník nejprve jak jen předplatitelé mohou psát.
  5. V samotné zpráve, dát co nejvíce informací, jak je to možné – trasování zásobníku, reprodukovatelné a krátký příklad kódu, XML soubor způsobuje problémy. Ujistěte se, že uvést verzi JDOM použité (oficiální verze nebo GitHub potvrzení).
  6. Máte-li opravu odstranit chybu, prosím, tvrdí, že spolu se zprávou o problému. Milujeme záplaty.

Kde se mohu dozvědět více?

Dokumentace JDOM API, klouže od počátečního JDOM oznámení a další užitečné zdroje mohou být všechny možné stáhnout zde.