| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > вопрос по JAXP 1.2 |
| Автор: check 26.1.2007, 16:32 | ||
| Возникла необходимость преобразовать xml-документ в другой формат(текстовый файл с разделителями). Для обработки XML решил использовать JAXP 1.2. Для того чтобы начать с ним работать нужно скомпилировать исходники и получить следующий набор JAR-файлов
Как сказано в ридми, скачал apache-ant-1.7.0, создал переменную ANT_HOME, прописал там путь к каталогу Ant, из каталога JAXP запустил команду -ant jars Ответ: ant не является исполняемым файлом и т.д. |
| Автор: Tony 26.1.2007, 17:12 |
| Посмотри как правельно ти написал ANT_HOME. Там должна быть папка bin. Типа: ANT_HOME = c:\ant PATH = %ANT_HOME%\bin Перегрузи компик. |
| Автор: LSD 26.1.2007, 17:16 |
| Пропиши каталог %ANT_HOME%\bin в PATH. |
| Автор: check 29.1.2007, 10:01 |
| Как я понимаю, XSLT позволяет вывести XML в том или ином виде, но разве он может записать текст в файл? |
| Автор: check 29.1.2007, 11:41 | ||||||
Всё это сделал. Когда выполняю команду -ant jars, получаю ту же ошибку. Попробовал так
Добавлено @ 11:45 Но это означает что в переменных окружения все верно. |
| Автор: LSD 29.1.2007, 12:13 |
| 1. Проверь что в каталоге %ANT_HOME%\lib есть файл ant-commons-net.jar 2. Проверь что переменная ANT_HOME указывает именно на коневую папку ANT-а, а не на bin или еще куда. |
| Автор: check 29.1.2007, 12:53 |
| Оба пункта проверил. ant-commons-net.jar есть. ANT_HOME=C:\Ant. |
| Автор: Tony 29.1.2007, 13:34 | ||
Конечно может.ХМЛ + ХСЛТ = fajl HTML |
| Автор: LSD 29.1.2007, 14:32 |
| Значит тебе понадобится еще http://jakarta.apache.org/commons/net/index.html, надо будет положить файл commons-net.jar в каталог %ANT_HOME%\lib. Только зачем он понадобился, что написано в readme по поводу сборки JAXP, он что исходники пытается из сети качать? P.S. Ты не можешь перейти на JDK 1.5 и старше (там уже все встроено)? |
| Автор: check 29.1.2007, 14:56 |
| У меня JDK 1.5.0_07. Добавлено @ 15:00 По моему это просто XML, к которому применены стили XSL. |
| Автор: LSD 29.1.2007, 15:01 |
| В JDK 1.5 встроен JAXP 1.3. |
| Автор: check 29.1.2007, 15:30 | ||
Какие классы надо импортировать для работы с SAX?
Не один из этих классов компилятор не находит. |
| Автор: batigoal 29.1.2007, 16:27 |
XSLT - это язык задания преобразований XML. Поэтому сам по себе он не занимается записью в файл. Это может сделать XSLT-процессор. А с помощью XSLT ты можешь преобразовать XML-ник в другой XML-ник, HTML, txt, PDF, fb2... |
| Автор: check 29.1.2007, 16:41 | ||
|
| Автор: LSD 29.1.2007, 17:09 |
Не может этого быть, все эти классы есть в JDK 1.5 (они даже есть в JDK 1.4). http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPXSLT6.html |
| Автор: check 29.1.2007, 17:21 |
Это кажется понял. [ |
| Автор: check 30.1.2007, 14:23 | ||||
| Решил все-таки делать через SAX. Вот класс, который выводит названия всех тегов и заключенные в них текстовые значения
Строковые поля объявленные в начале - это значения нескольких тегов которые, предположим , меня интересуют(на самом деле их конечно больше). Далее я должен эти поля поместить в массив, а массив передать в конструктор класса, пишущего в файл. Это конечно приблизительная схема, имя txt-файла будет определятся именем XML-я.
Вопрос в том как организовать в методе characters() присвоение текстовых значений тегов соответсвующим переменным. То есть если тег называется <ИНН>, берем его значение и помещаем в inn, и так далее. |
| Автор: batigoal 30.1.2007, 14:43 |
| check, сделай через HashMap. Ключом будет "inn", значением - соответственно, его значение. |
| Автор: check 30.1.2007, 15:01 | ||||
Вроде бы они и извлекаются, но в файл пишутся переводы строки через запятую.
|
| Автор: check 30.1.2007, 16:05 |
| Причина в том, что метод haracters() вызывается для каждого тега и соответственно файл каждый раз перезаписывается тем что есть в массиве на данный момент. При последнем вызове, поскольку тег не подходит ни под одно из условий, массив пустой. |
| Автор: LSD 30.1.2007, 17:37 |
| Сделай запись в файл в обработчике endDocument (), и перейди на DocumentHandler. |
| Автор: check 30.1.2007, 17:43 | ||||||||||
Я вспомнил про метод endDocument(). Запись в файл я поместил туда, тобы она происходила один раз при достижении конца документа.
Но переменные которым в методе characters() присвоены значения:
в endDocument() пусты. Соответственно массив тоже пуст, а в файл пишутся квадраты через запятую Провёл такой эксперимент. При объявлении присвоил переменным начальные значения
При этом если их вывести в самом методе characters(), они имеют нормальные значения взятые из xml-я. Добавлено @ 17:45
Первое уже сделал. Что такое DocumentHandler? |
| Автор: LSD 30.1.2007, 17:51 | ||||
Вместо:
используй:
По поводу первой проблемы, посмотри под отладчиком метод characters() вообще вызывается. |
| Автор: check 30.1.2007, 18:01 | ||||
Пришлось сделать так
В интерфейсе DocumentHandler нет метода parse(). Но ничего не изменилось. characters() вызывается
|
| Автор: check 31.1.2007, 10:34 |
| Как сделать чтобы в файл добавлялись строки не пеезаписывая файл? (да, плоховато я ещё знаю Java=)) Это нужно в любом случае, но я ещё чувствую, что это ключ к решению проблемы. Похоже на то, что метод characters() вызывается в любом случае более одного раза для каждого тега и при последнем вызове считывает то ли null, то ли перевод строки. |
| Автор: check 31.1.2007, 11:06 | ||||||
Нашел
Так и есть. Вот что пишется для в файл из такого тега: <СистемныйНомерМассиваПоручений>060-009-2006-00005</СистемныйНомерМассиваПоручений> Тег встречается в документе два раза
То есть получается - текст, потом два перевода строки. |
| Автор: check 31.1.2007, 16:48 | ||||
Последовал совету - создал типизированный HashMap
Код теперь выглядит гораздо приятнее, хотя переводы строки в файл по-прежнему пишутся. Вопрос решён, большое спасибо! |