Запитання й відповіді для JDOM



Що JDOM?

JDOM тобто, просто кажучи, уявлення Java з XML документа. JDOM забезпечує спосіб викладу документа, легкого і ефективного читання, маніпуляції і письмовій формі. Вона має простий API, це легкий і швидкий, і оптимізований для Java програміста. Це альтернатива DOM і SAX, хоча це добре інтегрується з обох DOM і SAX.



Що JDOM ні?

JDOM є НЕ обгортка для DOM від W3C, або інша версія DOM. JDOM є Java-основі "об'єктна модель документа» для XML-файлів. JDOM служить тієї ж мети, що і DOM, але простіше у використанні.

JDOM НЕ XML-парсер, як Xerces або Crimson. Це об'єктна модель документа, яка використовує XML парсери побудувати документи. SAXBuilder клас JDOM для прикладу використовує SAX події, що генеруються XML парсер, щоб побудувати JDOM дерево. За замовчуванням XML-парсер використовується JDOM є JAXP обраний аналізатор, але JDOM може використовувати практично будь аналізатор.


Є JDOM абревіатурою?

Нє-а. Так само, як JDBC не є офіційно абревіатура, ні один не JDOM. Це гарантує нам відповідати правилам Сонця товарних знаків, як описано в http://www.sun.com/policies/trademarks .


Що таке ліцензія JDOM?

JDOM доступний під Apache стилі ліцензії з відкритим вихідним кодом, з обмовкою підтвердження видалені. Ця ліцензія є одним з найменш обмежувальної ліцензії доступні, що дозволяє розробникам використовувати JDOM в створенні нових продуктів, не вимагаючи їх звільнити свої власні продукти з відкритим вихідним кодом. Це модель ліцензія використовується Apache Project, який створив сервер Apache. Ліцензія надається на вершині кожного вихідного файлу і в license.txt докорінно дистрибутива.


Де я можу отримати JDOM?

JDOM доступний в довічним і джерела формі від http://www.jdom.org .

JDOM також доступна в Maven центрального в групі "org.jdom» з артефакту ID JDOM для JDOM 1.x (і деяких більш ранніх версіях 2.x): JDOM 1.x Артефакти на Maven , або з артефактом ID jdom2 для JDOM 2.x: JDOM 2.x Артефакти на Maven

Повний репозиторій вихідного коду підтримується на GitHub .


Які Maven артефакт я повинен використовувати?

Всі версії JDOM доступні в "JDOM" або "jdom2" артефакт в org.jdom групи по Maven . Артефакти Maven панує безлад з ранніх 2.x версій JDOM, що входять в "JDOM" артефактів, і пізніших версій 2.x в артефакту "jdom2. Maven не дозволяє фіксацію помилок, так Maven користувачі Віль просто повинні жити з нею, як вона є.

Якщо ваш проект, що вимагає як JDOM 1.x і 2.x, то ви також можете використовувати 'JDOM-спадщина "артефакт тягнути в версії 1.1.3 (або більш пізньої версії 1.x).


Яка JDOM Філософія?

JDOM був і продовжуватиме розвиватися з цією філософією:

  • JDOM повинен бути простим для Java програмістів.
  • JDOM повинні підтримувати простий і ефективний модифікації документа.
  • JDOM повинні приховання складнощів XML скрізь, де це можливо, при цьому залишаючись вірним специфікації XML.
  • JDOM повинні інтегруватися з DOM і SAX.
  • JDOM повинен бути легким і швидким.
  • JDOM повинні вирішити 80% (або більше) з Java проблем / XML з 20% (або менше) від зусиль

Чому JDOM API визначається в термінах конкретних класів, а не інтерфейси?

Це питання обговорювалося кілька разів на розсилку JDOM, з кількома людьми з обох сторін. Загалом, багато людей вважають, що API на основі класів краще, коли підкласів не потрібно, тоді як API-інтерфейс на основі краще, коли необхідна підкласів. Проте, або система може бути використана в будь-якому випадку.

Джейсон Хантер підсумовує аргументи проти з API інтерфейс на базі для JDOM:

З інтерфейси все стає на заводі, елементи повинні бути «імпортний» в нові документи, замість щойно додали, функцій, таких як довгострокове серіалізациі не може бути гарантована, і цей список можна продовжити.

Ми почали з інтерфейсами насправді. Під час нашого попередньою версією огляду на деяких однолітків, які ми отримали зворотний зв'язок, ми повинні спробувати конкретні класи. Ми зробили, і дизайн був набагато краще для нього.

Подумайте про те, java.io.File як аналогію. Там причина ми говоримо:

Файл батько = новий файл (FilePath);
Файл дитина = новий файл (батько, "aaa.txt");

а не

Файлова система FS = FileSystem.getDefaultFileSystem ();
Батько File = fs.getFile (FilePath);
Дитина File = fs.getFile (батько, "aaa.txt");

Колишній просто легше і приємніше мати справу з.

Ще один момент, щоб мати на увазі, що все, що можна зробити з інтерфейсами можна зробити з підкласів - тільки штраф, можливо, невикористовувані змінні в базовому класі.

Для довідки, остання дискусія список розсилки на цю тему розпочався 30 листопада 2000 із "Інтерфейси", і продовжив з "JDOM інтерфейс на основі" і "Анонс: JDOMPlus". Це допомогло б переглянути цю дискусію до пред'явлення темою на розсилку.


Як JDOM працювати з DOM і SAX?

Документи JDOM можуть бути побудовані з XML-файлів, DOM дерев, SAX подій, або будь-якого іншого джерела. Документи JDOM можуть бути перетворені в XML-файлах, DOM, SAX дерев подій, або в будь-яке інше місце. Ця здатність виявляється корисним, наприклад, при інтеграції з програмою, яка розраховує SAX події. JDOM може розібрати XML файл, нехай програмісту легко і ефективно маніпулювати документом, то вогонь SAX події на другий програми безпосередньо - НЕ перетворення в послідовну форму форматі не потрібно.


Був JDOM призначений для дженериків?

JDOM був розроблений до Дженерики, але JDOM 2.x взяла перевірену конструкцію JDOM 1.x і розширив його використовувати Generics де це можливо. Зокрема, всі операції Колекції основі вимагають відповідним чином введені входи, і повернутися відповідним типізованих результатів. Крім того, JDOM 2.x користується іншими Java 5 функцій, таких як масиву аргументів, і со-варіант повертані типи.

Дженерики: Element.getAttributes () повертає List <Атрибут>, Element.getChildren () повертає List <Елемент>, і т.д.

Спільне варіант Типи повертаних: Element.clone () повертає елемент, Text.detach () повертає текст, і т.д.


Я намагався використовувати JDOM і отримати таку помилку:

java.lang.NoSuchMethodError 
    або 
java.lang.NoClassDefFoundError: орг / XML / саксофон / SAXNotRecognizedException

Що не так?

Ви повинні переконатися, що xerces.jar файл поставляється з JDOM завантаження в вашому шляху до класів перед будь-якими іншими класами XML, такі як ті, що приходять з JAXP або Crimson. Ці та інші XML-бібліотеки, а також старі версії Apache Xerces, підтримка DOM Level 1 і SAX 1.0, не потрібно DOM Level 2 і SAX 2.0. Результатом є винятком кидка. Перевірте свій шлях до класів, і спробуйте знову. Якщо шлях до класів виглядає нормально, проблематично JAR також може ховатися в стандартному каталозі розширення системи (див нижче).


Що ви маєте на увазі "Стандартний каталог розширення"?

Стандартний каталог розширення це каталог, який містить JAR-файли, які автоматично шукали середовищем виконання Java і компілятор. Якщо ви встановили JDK (не тільки JRE) ви можете також мати дві окремі доб каталоги, один з яких використовується для компіляції (як правило, десь, як C: \ jdk1.3 \ JRE \ Lib \ доб ), а другий з яких використовується для запуску коду (зазвичай десь, як C: \ Program Files \ JavaSoft \ JRE \ 1.3 \ Lib \ доб ). Неправильний файл JAR в будь-якому каталозі можна отримати на вашому шляху (хоча в різний час). Крім того, право файл JAR повинен бути в обох каталогах.


Як уникнути проблеми DOM Level 1 в Visual Age для Java?

Коли функція WTE додається в робочу область, проект «IBM XML Parser для Java» додається також. Цей проект містить 'org.w3c. *' Старого DOM Level 1 інтерфейси. JDOM спирається на DOM Level 2, і, отже, conficts з цим проектом. Рішення зробити наступне:

  1. Власник Змінити робочий простір для адміністратора
  2. Створити відкриту редакцію проекту «IBM XML Parser для Java"
  3. Видалити всі пакети, які містять org.w3c. * інтерфейси
  4. Версія проект.
  5. Створення нового проекту для DOM Level 2 парсер таких як Xerces
  6. Імпорт всіх класів Xerces включаючи org.w3c. * інтерфейси (можна використовувати абсолютно інший проект для тих інтерфейсів, якщо ви хочете працювати з іншими аналізаторами)
  7. Версія Xerces проект
  8. Створення проекту JDOM і імпортувати класи JDOM в ньому. Версія проект

(Внесено Гай Nirpaz)


Як уникнути проблеми DOM Level 1 в WebSphere?

WebSphere має ту ж проблему з DOM Level 1 інтерфейсів, як вай вище. Рішення зробити одне наступне:

  • Покладіть шлях до xerces.jar (або інші DOM Level 2 інтерфейсу) в змінній ' com.ibm.ejs.sm.adminserver.classpath 'в файлової admin.config . Це знаходиться в $ WAS_ROOT $ / бен перед усіма іншими змінними.
  • або, якщо ви бігти було $ WAS_ROOT / бен / налагодження / AdminServer. {битою | ш} додати рядок " встановити WAS_CP = xerces.jar "(або інший DOM Level 2 інтерфейси) перед іншими набір WAS_CP команд.
  • або додайте JDOM на сервер CLASSPATH додатки, використовуючи або admin.cfg файл або консоль адміністрування.

(Внесено Гай Nirpaz)


Яка версія JDOM працює з якої JDK?

Версії 1.x JDOM підтримує JDK 1.2 і пізніших версій.

Версії JDOM 2.x підтримує JDK 1.5 і пізніших версій.


Чи є якісь показники продуктивності?

Процес розробки 2.x JDOM включені контрольні показники для відстеження змін продуктивності. Є показники продуктивності, які порівнюють різні версії JDOM 2.x , а також порівняння продуктивності JDOM на різних версіях JDK .

Денис Сосновський в минулому побіг тестів продуктивності. Загалом, більшість моделей об'єктів XML знаходяться в подібній околиці.


Як JDOM інтеграції з XSLT?

Є багато способів зробити XSL перетворює з JDOM. Найпростіший спосіб полягає у використанні стандартного JAXP Transformer інтерфейс і JDOMSource / JDOMResult класи, знайдені в org.jdom2.transform пакета. Подивіться на зразок імені XSLTransform для прикладу.


Є підтримка XPath в JDOM?

Так! Це повністю інтегрована в org.jdom2.xpath як Бети 9, на основі Jaxen .


Які особливості XML не обробляються JDOM?

Ні що ми знаємо.


Є JDOM поточно?

Ядро API навмисно НЕ поточно. Іншими словами, немає синхронізовані блоки в org.jdom. Це рішення має сенс, тому що ми очікуємо, що основні способи використання JDOM бути:

  • Одномісний потік зчитує потік XML в JDOM і дивиться на це тільки для читання
  • Одномісний потік зчитує потік XML в JDOM і змінює його
  • Одномісний потік зчитує потік XML в JDOM і робить його доступним для системи часу виконання для доступу на читання

Використання випадок, коли "один потік читає потік XML в JDOM і виставляє його на кілька потоків, щоб змінити його зміст» досить рідко. В цьому випадку, все ще JDOM можуть бути зроблені потоково але програміст повинен просто виконувати свою власну синхронізацію, може бути, як синхронізація за прикладом документа.

З іншого боку, є певні функції, які вимагають «оперативні» частини JDOM бути безпечним Тема:

  • org.jdom2.Namespace.getNamespace () безпечна
  • Всі класи завод типу безпечні (XPathFactory і т.д.)

Чому дорівнює () тільки зробити == чек?

В JDOM два Вміст об'єкти тільки рівними, якщо вони точно такий же об'єкт. Це дозволяє на виклик, як list.remove (елем) видалити тільки точне Елемент передається в, а не який-небудь елемент, що еквівалентно. Це дуже важлива відмінність. Робити повний одно () на елемент потребують рекурсії вниз по дереву, і в цілому ми вважаємо, що навряд чи ви хочете знати, якщо цей елемент і всі його діти еквівалентні інший. Якщо ви дійсно хочете знати, що ви можете написати деякі порівняння код самостійно, що перевіряє тільки стільки, скільки ви хочете перевірити (можливо ім'я / тільки імен), а не робити повний рекурсивно.


Чому дорівнює () оголошена остаточна?

В дорівнюють () методи є остаточними для JDOM контенту класів так, що підклас не може порушити == поведінку, що вимагається для дзвінків як list.remove (елем) працювати, як задумано. Точно так же хеш-код () методи також фінал (зберегти дорівнює / контракт хеш-код).


Як побудувати документ з рядка?

Ви можете використовувати стандартні бібліотечні виклики Java IO. Оберніть рядок з StringReader і передати читачеві SAXBuilder :

Документ Doc = builder.build (новий StringReader (XML));

Як видалити елемент або інший контент?

Використовуйте методи на список возвращаемого GetChildren () або getContent () . JDOM не потрібні спеціальні методи, тому що методи вже існують в список . Наприклад, щоб видалити елемент зі списку дітей:

Список дітей = parent.getChildren ();
children.remove (елемент); // Враховуючи дитина
children.remove (0); // Перша дитина

Інші методи по Список надають можливості для усунення всіх дітей, додати дитини в певному місці, і так далі.

Якщо у вас є конкретний елемент або іншого контенту, який ви хочете видалити зі свого батька, ви можете від'єднати контенту з методом Content.detach ().


Як перемістити елемент з одного місця в інше?

Там немає необхідності для вузла "імпорту" як є з DOM. Просто видалити елемент з поточного місця, а потім додати елемент на нове місце. Вмісту елемента (в тому числі його дочірніх елементів), природно, "тега" з собою в поїздку. Ви повинні видалити елемент, перш ніж додати його новому місці, бо елементи можуть мати тільки одного батька, повернене GetParent () .

newParent.addContent (elt.detach ());

Як скопіювати елемент з одного місця в інше?

Там немає необхідності для вузла "імпорту" як є з DOM. Просто клонувати елемент копіюється і додати його клон в новому місці. Ви повинні клонувати елемент, перш ніж додати його новому місці, бо елементи можуть мати тільки одного батька, повернене GetParent () .

newParent.addContent (elt.clone ());

Може імені елемента або атрибута містить двокрапку?

Специфікація XML 1.0, спеціально залишає за собою символ двокрапки для використання з просторами імен XML. Ніяке інше використання не відповідає XML 1.0. Тому JDOM не дозволяють створювати імена елементів і атрибутів, які містять двокрапки винятком випадків, коли за допомогою простору імен. Крім того, через спосіб імен реалізовані в JDOM, ви не можете просто створити елемент або атрибут з повним ім'ям, як SVG: назва . Тобто ви не можете зробити це:

Елемент е = новий елемент ("SVG: Назва");

Замість цього ви повинні розділити ці дві частини в просторі імен і локального імені. Це правильний JDOM спосіб створити елемент в просторі імен:

Елемент е = 
  Новий елемент ("назва", "SVG", "http://www.w3.org/2000/svg");

Перший аргумент це місцева назва. Другий аргумент є префіксом. Третій аргумент є простором імен URI.

Якщо ви намагаєтеся створити XML: Lang і XML: космічні атрибути використовувати:

Елемент е = 
  Новий елемент ("мова" Namespace.XML_NAMESPACE);

Чому мені потрібно пройти в простір імен до GetChild () , коли дитина елемент Я шукаю не має декларацію простору імен?

Зокрема, для цього XML фрагмента:

<Х>
  <У XMLNS = "http://foo.com">
    <Г />
  </ У>
</ Х>

Ви повинні використовувати такий код:

Простір імен нс = Namespace.getNamespace ("http://foo.com");
Елемент у = x.getChild ("Y", нс);
Елемент г = y.getChild ("Z", нс);

 


Якщо я піду з простору імен з другого виклику GetChild (), вона повертає нуль. Чому?

JDOM працює на логічному в пам'яті XML дерева, а не текстове представлення на диску. Тоді як елемент г не має простору імен заяву , у нього є простір імен - той, успадкований від свого батька, яка заявляє, простір імен за замовчуванням (пов'язаний з URI http://foo.com).

Відповідно до специфікації просторів імен, наступний фрагмент XML-ідентична за значенням до попереднього:

<Х>
  <У XMLNS = "http://foo.com">
    <Z XMLNS = "http://foo.com" />
  </ У>
</ Х>

Таким чином, що API JDOM обробляє імен означає, що ви можете написати код, який працює для обох прикладах. В іншому випадку, вам потрібно буде мати код, який перевіряється окремо для кожного випадку.

Точно так же, якщо ви будували (замість читання) в XML і в першому прикладі вище, ви повинні були б написати такий код:

Простір імен нс = Namespace.getNamespace ("http://foo.com");
Елемент у = новий елемент ("Y", нс);
x.addContent (у);
Елемент Z = новий елемент ("Z", нс);
y.addContent (г);
Якщо ви не врахували простору імен примірника з конструктора для елемента г , вам доведеться наступне дерево в пам'яті:
<Х>
  <У XMLNS = "http://foo.com">
    <Z XMLNS = "" />
  </ У>
</ Г>

Чому все нові лінії з'являються як \ п, навіть на Windows?

Відповідно до розділу 2.11 Рекомендації XML, 2-е видання:

Для спрощення завдання додатків, процесор XML повинен нормалізувати розриви рядків в проаналізованої в #xA або шляхом перекладу послідовність з двох символів #xD #xA і будь #xD що не випливають #xA до #xA на вході до розбору , або за допомогою іншого методу, так що символи, передані в додаток такі ж, як якщо б це було цей переклад.

Іншими словами, це саме те, що має статися.

Деякі вхід XML може уникнути повернення \ г каретки як і # XD; і XML-парсер буде перевести це в до істинного \ г персонажа у вашій JDOM Текст. При цьому Текст виводиться знову буде повторно біг як і # XD; .


Чому SetText ("& # 160;") не то, що я хочу?

При передачі рядка в метод як SetText () JDOM припускає, що це якраз те, рядок, а не фрагмент XML. Наприклад, при виклику:

element.setText ("& # 160;")

JDOM припускає, що ви хочете встановити вміст у рядок, що містить шість символів & # 1 Червня 0 ; . Це не розібрати його, щоб спробувати зрозуміти його як XML-перше. Таким чином, коли ви виводите текст, використовуючи XMLOutputter вона, природно, уникнути особливий характер і вихід амперсанд & Amp; # 160; . Рішення пройти звичайні символи Unicode з методом SetText () або, якщо у вас є текстові дані, які ви хочете бути витлумачено як XML, передати його через XML парсер, перш ніж він йде в JDOM. Це те, що роблять класи SAXBuilder і DOMBuilder.


При використанні IDE відладчик Чому я бачу дивний ArrayIndexOutOfBoundsException?

Деякі аналізатори (Xerces включені) використовувати це виняток, як частина їх стандартної операційної процедурою, внутрішньо кидати і ловити виняток. Немає код за межами бібліотеки немає у вигляді побачити його. Проте, IDE отладчики часто налаштовані на доповідь в будь-який час дане виключення, і, таким чином, вони показують виняток. Це може бути проігноровано.


Як мені додати ІП або коментар перед кореневим елементом?

Ви повинні отримати доступ до вмісту документа як список . Або отримати список і додайте контент до його голови, або задати список вмісту явно.

doc.getContent () додати (0, пі) .;
або
doc.setContent (listOfContent);

Як мені уникнути попадання OutOfMemoryError?

Більшість віртуальних машинах є опціон на збільшення своєї максимальний розмір купи, яка Максимальний обсяг пам'яті JVM може використовувати для своїх об'єктів. Ви можете налаштувати свій початковий розмір купи до 32 мегабайт і максимальний розмір купи в 64 мегабайт за допомогою наступної команди:

Java -Xms32m -Xmx64m SomeClass

Якщо вам не потрібно весь документ в пам'ять, подивіться на org.jdom.contrib.input.scanner пакеті JDOM-вно модуля, який дозволяє побудувати частина документа, відповідного виразу XPath.


Чому мій кодування файлу на виході не відповідає кодуванні на вході?

Кодування символів за замовчуванням використовується XMLOutputter є UTF-8, кодування змінної довжини, які можуть представляти всі символи Unicode. Це може бути змінено за допомогою виклику format.setEncoding () на формат об'єкта, переданого в XMLOutputter . Було б добре, якщо XMLOutputter може оголосити дефолт у вихідне кодування для файла, але, на жаль, аналізатори не вказують вихідної кодування. Ви повинні встановити його програмно.

Це питання найчастіше вражає людей з документами в загальній ISO-8859-1 (Latin-1) кодування, які використовують символи як ñ але не знайомі з того, щоб думати про кодування. Кінчик пам'ятати, що з цими документами необхідно встановити вихідний кодування ISO-8859-1, в іншому випадку символи в діапазоні 128-255 буде вихід, використовуючи кодування двухбайтном в кодуванні UTF-8, а не в звичайній кодуванні один байт ISO-8859-1.


Чому проходження документа через сокет іноді зависає парсер?

Проблема в тому, що кілька XML-аналізатори закрити вхідний потік, коли вони читають EOF (-1). Це вірно Xerces, що на парсер JDOM за замовчуванням. Це також відноситься і до Crimson. На жаль, закриття SocketInputStream закриває лежачий SocketImpl , встановивши дескриптор файлу для NULL . Вихідний потік сокета марно після цього, так що ваша заявка буде не в змозі відправити відповідь. Щоб обійти, захисту вхідний потік вашої сокета з InputStream обгортці, що не закриває основний потік (перевизначити близько () метод), або читати все в буфер перед тим як перейти до будівельника JDOM:

байт [] ЬіЕ = новий байт [довжина];
Новий DataInputStream (InputStream) .readFully (ЬіЕ);
Вхідний потік в = новий ByteArrayInputStream (BUF);
(Внесено Джозеф Bowbeer)

Як зробити так, щоб DTD від навантаження? Навіть коли я вимикаю перевірку парсер намагається завантажити файл DTD.

Навіть тоді, коли перевірка відключена, XML-парсер буде за замовчуванням завантажує зовнішній файл DTD для того, щоб розібрати на DTD для зовнішніх сутностей. Xerces має функцію відключення такої поведінки по імені "http://apache.org/xml/features/nonvalidating/load-external-dtd" і якщо ви знаєте, що ви використовуєте Xerces ви можете встановити цю функцію на забудовника.

builder.setFeature (
  "Http://apache.org/xml/features/nonvalidating/load-external-dtd", брехливо);

Якщо ви використовуєте інший аналізатор, як пурпур, вам найкраще створити EntityResolver, дозволяючим DTD не читаючи окремий файл.

імпортувати org.xml.sax * .;
імпорт java.io. *;
суспільного класу NoOpEntityResolver реалізує EntityResolver {
  громадського InputSource resolveEntity (String publicId, String SYSTEMID) {
    повернутися нову InputSource (новий StringBufferInputStream (""));
  }
}

Тоді в будівельника ...

builder.setEntityResolver (новий NoOpEntityResolver ());

Існує і зворотний бік цього підходу. Будь-які об'єкти в документі будуть вирішені в порожній рядок, і буде ефективно зникають. Якщо в документі особи, вам необхідно setExpandEntities (помилковою) код і забезпечити EntityResolver тільки пригнічує DOCTYPE.


Як перевірити на відповідність схемі при використанні JDOM 2.x?

JDOM 2.x вводить спрощену модель для перевірки документів. Org.jdom2.input.sax.XMLReaders Enum містить членів, які створили свій перевірку для вас.

Повний код в JDOM 2.x виглядає наступним чином:

SAXBuilder будівельник =
  новий SAXBuilder (XMLReaders.XSDVALIDATING);
Документ док = builder.build (XML);


Як перевірити на відповідність схемі при використанні JDOM 1.x?

JDOM 1.x не має свій власний парсер, він використовує стандартні аналізатори, як Xerces щоб робити важку роботу. Якщо ви хочете перевірка схеми переконайтеся, що ви вибираєте парсер, який підтримує схеми. Xerces 2 є хорошим вибором (отримати його з http://xml.apache.org ). Крім того, необхідно використовувати код JDOM Beta 8 або новіша.

Щоб вказати парсер JDOM використовує, ви можете або налаштувати JAXP відповідним (з JDOM використовує JAXP, якщо це доступно, побачити кінець цією позицією деталей), або ви можете явно передати ім'я аналізатором конструктору SAXBuilder. Для Xerces 2 клас парсер org.apache.xerces.parsers.SAXParser . Ви також повинні включити перевірку аналізатора, передаючи "правда" при створенні SAXBuilder.

SAXBuilder будівельник =
  новий SAXBuilder ("org.apache.xerces.parsers.SAXParser", правда);

Далі, Ви говорите парсер (Xerces) ви хочете перевірити на відповідність схемі (або схем), і ви проходите інформацію парсер про тих схемою. Різні аналізатори робити це по-різному. В Xerces ви зробите це, встановивши спеціальні «особливості» і «Властивості» з синтаксичного аналізатора. JDOM виставляє ці настройки аналізатора з setFeature () і SetProperty () методів на SAXBuilder. Ці методи пропускання через були додані після Beta 7, тому ви повинні Beta 8 або вище.

Схеми включені з налаштування функцій "http://apache.org/xml/features/validation/schema" до істинних.

builder.setFeature (
 
"http://apache.org/xml/features/validation/schema", правда);

Місця схеми дано, встановивши властивість "http://apache.org/xml/properties/schema/external-schemaLocation" в список прогалин відокремлюють пар ім'я-значення. 'Ім'я' є простором імен схема пов'язана з, «цінність» є розташування схеми для цього простору імен. Наприклад:

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

Наведений приклад показує, як перевірити на декількох схем - проти SOAP 1.2 схему, де простір імен http://www.w3.org/2001/12/soap-envelope і і проти схеми для простору імен HTTP: // kevinj.develop.com/weblog/weblog.xsd. Файли, що описують ці схеми знаходяться в мильній envelope.xsd і weblog.xsd відповідно. Ви можете додати, як багато хто з цих пар ім'я-значення, якщо необхідно. Самі значення URL-адреси. Пари ім'я значення слідувати значення, вказане в рекомендації схеми ( http://www.w3.org/TR/xmlschema-1/#schema-loc ).

Повний код виглядає наступним чином:

SAXBuilder будівельник =
  новий SAXBuilder ("org.apache.xerces.parsers.SAXParser", правда);
builder.setFeature (
  "http://apache.org/xml/features/validation/schema",   мило-envelope.xsd "+" "+   "http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd"); Документ док = builder.build (XML);




Якщо ви хочете використовувати JAXP для вибору парсер, ви можете пропустити вказавши клас в конструктор SAXBuilder і замість установки системне властивість "javax.xml.parsers.SAXParserFactory" до значення "org.apache.xerces.jaxp.SAXParserFactoryImpl" , Це говорить JAXP використовувати фабрику Xerces "побудувати аналізатори. Якщо вам подобається, ви можете вказати цю нерухомість в командному рядку:

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

(Внесено Кевін Джонс)


Як я можу виконувати перевірку в пам'яті проти DTD або схеми?

В даний час ви не можете зробити це, в JDOM або будь-якого іншого документа Java об'єктної моделі API. Проте, це те, що ми хотіли б JDOM для підтримки, і у нас є доброволець, який працює над цим.


JDOM забезпечує документ в пам'яті завжди добре сформований. Може JDOM також забезпечити документ в пам'яті завжди справедливо?

Ні, це наша поточна переконання, що краще виставити checkValid () тип виклику, ніж намагатися перевіряти постійну перевірки. Однією з причин є продуктивність. Друга причина полягає в тому, що у вас є проблема курки і яйця, де, наприклад, елемент повинен рівно два дочірні елементи, щоб бути дійсним, але після додавання або дитини документ буде в тимчасово неприпустимому стані. Щоб обійти це зажадає щось подібне модифікацій транзакційних, і це багато накладних витрат для невеликого прибутку.


Чому я отримую IndexOutOfBoundsException або ConcurrentModificationException на цикл?

Подібний код буде кидати IndexOutOfBoundsException:

 Список дітей = root.getChildren ("Foo");
 INT розмір = children.size ();
 для (INT I = 0; г <розмір; я ++) {
   Елемент дитина = (Element) children.get (I);
   child.detach ();
   otherRoot.addContent (дитина);
 }

Причина в тому, що розмір списку попередньо обчислені, але розмір зменшується на одиницю при кожному виклику на відкріплення (), в результаті чого протягом циклу, щоб піти від кінця списку. Правильний спосіб петлі полягає в використанні ітератора. З итератор у вас немає цієї проблеми, і це швидше.

Проте, навіть з итератор, наступний код кидає ConcurrentModificationException:

 Список дітей = root.getChildren ("Foo");
 Итератор ITR = children.iterator ();
 в той час як (itr.hasNext ()) {
   Елемент дитина = (Element) itr.next ();
   child.detach ();
   otherRoot.addContent (дитина);
 }

Причина в тому, що виклик на відкріплення () змінює список дітей, у той же час итератор обходу списку, і це одночасно модифікація. Рішення полягає в використанні видалити метод ітератора () замість Весь текст () в цій ситуації:

Список дітей = root.getChildren ("Foo");
 Итератор ITR = children.iterator ();
 в той час як (itr.hasNext ()) {
   Елемент дитина = (Element) itr.next ();
   itr.remove ();
   otherRoot.addContent (дитина);
 }

Є архів для списків розсилки JDOM?

Так, всі повідомлення будуть доступні для вашого веб-прочитання. Нижче наведені пляма пошуку все-в-один архів:

Є додаткові архіви на:


Як мені відмовитись від підписки на розсилку?

URL управляти членство список (у тому числі підписку) кріпиться в нижній частині кожного повідомлення списку. Це має бути щось на зразок http://www.jdom.org/mailman/options/jdom-interest/ youraddr@yourhost.com . Не забудьте замінити "youraddr" з вашою адресою і "YOURHOST" з вашого хоста. Для JDOM-оголосити замінити "інтерес" на "оголосити" в URL.


Як мені створити в список розсилки з декількох адрес?

Для захисту від спаму, тільки члени розсилку, можуть залишати повідомлення. Щоб відправити з декількох облікових записів, підписатися кожен рахунок і встановити "Відключити доставки пошти", щоб "On" для всіх додаткових рахунків. Ви можете встановити цю функцію на URL, вказаною в попередній відповіді .


Чи повинен я здавати загальні XML питання Джейсон, Бретт, або Рольф?

Ні, вони досить зайняті вже. Але Ви можете замовити книгу Бретта Java і XML або один з інших XML вступних книги, як XML Біблії по Елліотт Рости Гарольд (один з наших видних членів списку JDOM-процентної).


У книзі Java і XML розповідає про JDOM 1,0; Тому плутанина?

Книга охоплює ранній бета-тестування. Багато чого змінилося (в кращу сторону), так як видання книги. Для найбільш точного JDOM API довіри Javadocs, а не книга. Бретт був трохи оптимістично, коли писав книгу. Його 2-е видання ставить речі прямо.


У мене є питання, що тут немає відповіді. Що я роблю?

По-перше, ви повинні шукати архіви списку JDOM . Наприклад, якщо ви використовуєте парсер Oracle і побачити IllegalTargetException який пахне рибний, ви можете шукати "оракула IllegalTargetException", і ви знайдете обговорення цього питання. Обшуки є потужним і швидким!

Якщо ви не можете знайти відповідь в архіві, ви можете розмістити на JDOM інтересів. Якщо ви думаєте, що знайшли помилку, переконайтеся, що ви виконаєте наступні поради про звіти про помилки!


Як мені повідомити про помилку?

Якщо ви вважаєте, що знайшли помилку в JDOM, будь ласка, виконайте наступні дії:

  1. Перевіряйте як відкриті питання і закрив питання , щоб переконатися, що це відома проблема.
  2. Перевірте, чи виникає проблема при використанні останньої версії розвитку (джерело .zip) з JDOM.
  3. Пошук по архіви списку розсилки JDOM , як описано вище.
  4. Якщо ви не можете знайти рішення з останньою знімка, або створити проблему на GitHub або пост на JDOM-відсоткової розсилку; переконайтеся, що ви абонент спочатку як тільки абоненти можуть залишати повідомлення.
  5. В повідомленні про помилку, дати якомога більше інформації, - трасування стека, відтворений і короткий приклад коду, в XML-файл, що викликає проблеми. Переконайтеся заявити версію JDOM використовуватися (офіційна версія або GitHub вчинити).
  6. Якщо у вас є патч, що виправляє помилку, будь ласка, стверджують, що разом із звітом проблеми. Ми любимо патчі.

Де я можу дізнатися більше?

API документація JDOM, ковзає від початкової JDOM оголошення, та інші корисні ресурси можуть бути завантажені тут .