|
JDOM тобто, проÑто кажучи, уÑÐ²Ð»ÐµÐ½Ð½Ñ Java з XML документа. JDOM забезпечує ÑпоÑіб викладу документа, легкого Ñ– ефективного читаннÑ, маніпулÑції Ñ– пиÑьмовій формі. Вона має проÑтий API, це легкий Ñ– швидкий, Ñ– оптимізований Ð´Ð»Ñ Java програміÑта. Це альтернатива DOM Ñ– SAX, хоча це добре інтегруєтьÑÑ Ð· обох DOM Ñ– SAX. |
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, з кількома людьми з обох Ñторін. Загалом, багато людей вважають, що 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 () повертає текÑÑ‚, Ñ– Ñ‚.д. |
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 з цим проектом. Ð Ñ–ÑˆÐµÐ½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ наÑтупне:
(ВнеÑено Гай Nirpaz) |
Як уникнути проблеми DOM Level 1 в WebSphere? WebSphere має ту ж проблему з DOM Level 1 інтерфейÑів, Ñк вай вище. Ð Ñ–ÑˆÐµÐ½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ одне наÑтупне:
(ВнеÑено Гай 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? ÐÑ– що ми знаємо. |
Ядро API навмиÑно ÐЕ поточно. Іншими Ñловами, немає Ñинхронізовані блоки в org.jdom. Це Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñ” ÑенÑ, тому що ми очікуємо, що оÑновні ÑпоÑоби викориÑÑ‚Ð°Ð½Ð½Ñ JDOM бути:
ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð¸Ð¿Ð°Ð´Ð¾Ðº, коли "один потік читає потік XML в JDOM Ñ– виÑтавлÑÑ” його на кілька потоків, щоб змінити його зміÑт» доÑить рідко. Ð’ цьому випадку, вÑе ще JDOM можуть бути зроблені потоково але програміÑÑ‚ повинен проÑто виконувати Ñвою влаÑну Ñинхронізацію, може бути, Ñк ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð° прикладом документа. З іншого боку, Ñ” певні функції, Ñкі вимагають «оперативні» чаÑтини JDOM бути безпечним Тема:
|
Чому дорівнює () тільки зробити == чек? Ð’ 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); |
Зокрема, Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ XML фрагмента: <Ð¥> <У XMLNS = "http://foo.com"> <Г /> </ У> </ Ð¥> Ви повинні викориÑтовувати такий код: ПроÑтір імен Ð½Ñ = Namespace.getNamespace ("http://foo.com"); Елемент у = x.getChild ("Y", нÑ); Елемент г = y.getChild ("Z", нÑ);
|
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. |
ДеÑкі аналізатори (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) |
Ðавіть тоді, коли перевірка відключена, 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 вводить Ñпрощену модель Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ документів. Org.jdom2.input.sax.XMLReaders Enum міÑтить членів, Ñкі Ñтворили Ñвій перевірку Ð´Ð»Ñ Ð²Ð°Ñ. Повний код в JDOM 2.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.
Далі, Ви говорите парÑер (Xerces) ви хочете перевірити на відповідніÑть Ñхемі (або Ñхем), Ñ– ви проходите інформацію парÑер про тих Ñхемою. Різні аналізатори робити це по-різному. Ð’ Xerces ви зробите це, вÑтановивши Ñпеціальні «оÑобливоÑті» Ñ– «ВлаÑтивоÑті» з ÑинтакÑичного аналізатора. JDOM виÑтавлÑÑ” ці наÑтройки аналізатора з setFeature () Ñ– SetProperty () методів на SAXBuilder. Ці методи пропуÑÐºÐ°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· були додані піÑÐ»Ñ Beta 7, тому ви повинні Beta 8 або вище. Схеми включені з Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ "http://apache.org/xml/features/validation/schema" до Ñ–Ñтинних.
МіÑÑ†Ñ Ñхеми дано, вÑтановивши влаÑтивіÑть "http://apache.org/xml/properties/schema/external-schemaLocation" в ÑпиÑок прогалин відокремлюють пар ім'Ñ-значеннÑ. 'Ім'Ñ' Ñ” проÑтором імен Ñхема пов'Ñзана з, «цінніÑть» Ñ” Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñхеми Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проÑтору імен. Ðаприклад:
Ðаведений приклад показує, Ñк перевірити на декількох Ñхем - проти 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 ). Повний код виглÑдає наÑтупним чином:
Якщо ви хочете викориÑтовувати JAXP Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ парÑер, ви можете пропуÑтити вказавши ÐºÐ»Ð°Ñ Ð² конÑтруктор SAXBuilder Ñ– заміÑть уÑтановки ÑиÑтемне влаÑтивіÑть "javax.xml.parsers.SAXParserFactory" до Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "org.apache.xerces.jaxp.SAXParserFactoryImpl" , Це говорить JAXP викориÑтовувати фабрику Xerces "побудувати аналізатори. Якщо вам подобаєтьÑÑ, ви можете вказати цю нерухоміÑть в командному Ñ€Ñдку:
(ВнеÑено Кевін ДжонÑ) |
Ð’ даний Ñ‡Ð°Ñ Ð²Ð¸ не можете зробити це, в JDOM або будь-Ñкого іншого документа Java об'єктної моделі API. Проте, це те, що ми хотіли б JDOM Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸, Ñ– у Ð½Ð°Ñ Ñ” доброволець, Ñкий працює над цим. |
ÐÑ–, це наша поточна переконаннÑ, що краще виÑтавити checkValid () тип виклику, ніж намагатиÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ñти поÑтійну перевірки. Однією з причин Ñ” продуктивніÑть. Друга причина полÑгає в тому, що у Ð²Ð°Ñ Ñ” проблема курки Ñ– ÑйцÑ, де, наприклад, елемент повинен рівно два дочірні елементи, щоб бути дійÑним, але піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ дитини документ буде в тимчаÑово неприпуÑтимому Ñтані. Щоб обійти це зажадає щоÑÑŒ подібне модифікацій транзакційних, Ñ– це багато накладних витрат Ð´Ð»Ñ Ð½ÐµÐ²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ прибутку. |
Подібний код буде кидати IndexOutOfBoundsException:
Причина в тому, що розмір ÑпиÑку попередньо обчиÑлені, але розмір зменшуєтьÑÑ Ð½Ð° одиницю при кожному виклику на Ð²Ñ–Ð´ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ (), в результаті чого протÑгом циклу, щоб піти від ÐºÑ–Ð½Ñ†Ñ ÑпиÑку. Правильний ÑпоÑіб петлі полÑгає в викориÑтанні ітератора. З итератор у Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” цієї проблеми, Ñ– це швидше. Проте, навіть з итератор, наÑтупний код кидає ConcurrentModificationException:
Причина в тому, що виклик на Ð²Ñ–Ð´ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ () змінює ÑпиÑок дітей, у той же Ñ‡Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ‚Ð¾Ñ€ обходу ÑпиÑку, Ñ– це одночаÑно модифікаціÑ. Ð Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñгає в викориÑтанні видалити метод ітератора () заміÑть ВеÑÑŒ текÑÑ‚ () в цій Ñитуації:
|
Є архів Ð´Ð»Ñ ÑпиÑків розÑилки JDOM? Так, вÑÑ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ доÑтупні Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ веб-прочитаннÑ. Ðижче наведені плÑма пошуку вÑе-в-один архів: Є додаткові архіви на: |
Як мені відмовитиÑÑŒ від підпиÑки на розÑилку? URL управлÑти членÑтво ÑпиÑок (у тому чиÑлі підпиÑку) кріпитьÑÑ Ð² нижній чаÑтині кожного Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÑпиÑку. Це має бути щоÑÑŒ на зразок http://www.jdom.org/mailman/options/jdom-interest/ youraddr@yourhost.com . Ðе забудьте замінити "youraddr" з вашою адреÑою Ñ– "YOURHOST" з вашого хоÑта. Ð”Ð»Ñ JDOM-оголоÑити замінити "інтереÑ" на "оголоÑити" в URL. |
Як мені Ñтворити в ÑпиÑок розÑилки з декількох адреÑ? Ð”Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту від Ñпаму, тільки члени розÑилку, можуть залишати повідомленнÑ. Щоб відправити з декількох облікових запиÑів, підпиÑатиÑÑ ÐºÐ¾Ð¶ÐµÐ½ рахунок Ñ– вÑтановити "Відключити доÑтавки пошти", щоб "On" Ð´Ð»Ñ Ð²ÑÑ–Ñ… додаткових рахунків. Ви можете вÑтановити цю функцію на URL, вказаною в попередній відповіді . |
ÐÑ–, вони доÑить зайнÑті вже. Ðле Ви можете замовити книгу Бретта Java Ñ– XML або один з інших XML вÑтупних книги, Ñк XML Біблії по Елліотт РоÑти Гарольд (один з наших видних членів ÑпиÑку JDOM-процентної). |
У книзі Java Ñ– XML розповідає про JDOM 1,0; Тому плутанина? Книга охоплює ранній бета-теÑтуваннÑ. Багато чого змінилоÑÑ (в кращу Ñторону), так Ñк Ð²Ð¸Ð´Ð°Ð½Ð½Ñ ÐºÐ½Ð¸Ð³Ð¸. Ð”Ð»Ñ Ð½Ð°Ð¹Ð±Ñ–Ð»ÑŒÑˆ точного JDOM API довіри Javadocs, а не книга. Бретт був трохи оптиміÑтично, коли пиÑав книгу. Його 2-е Ð²Ð¸Ð´Ð°Ð½Ð½Ñ Ñтавить речі прÑмо. |
У мене Ñ” питаннÑ, що тут немає відповіді. Що Ñ Ñ€Ð¾Ð±Ð»ÑŽ? По-перше, ви повинні шукати архіви ÑпиÑку JDOM . Ðаприклад, Ñкщо ви викориÑтовуєте парÑер Oracle Ñ– побачити IllegalTargetException Ñкий пахне рибний, ви можете шукати "оракула IllegalTargetException", Ñ– ви знайдете Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ питаннÑ. Обшуки Ñ” потужним Ñ– швидким! Якщо ви не можете знайти відповідь в архіві, ви можете розміÑтити на JDOM інтереÑів. Якщо ви думаєте, що знайшли помилку, переконайтеÑÑ, що ви виконаєте наÑтупні поради про звіти про помилки! |
Як мені повідомити про помилку? Якщо ви вважаєте, що знайшли помилку в JDOM, будь лаÑка, виконайте наÑтупні дії:
|
Де Ñ Ð¼Ð¾Ð¶Ñƒ дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ? API Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ JDOM, ковзає від початкової JDOM оголошеннÑ, та інші кориÑні реÑурÑи можуть бути завантажені тут . |