Dom Parser. Help.

susinmn

Well-known member
16.10.2007
529
3
#1
Нужно из xml-строки взять значение тэга. Пытаюсь делать через dom.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='vaja'> lotus.domino.Document abDoc = abDB.getDocumentByUNID(docUnID);
DxlExporter dxlExporter = session.createDxlExporter();
String exportResult = dxlExporter.exportDxl(abDoc);

// Получить Document Builder Factory
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();

// Включить проверку корректности и выключить пространства имен
factory.setValidating(true);
factory.setNamespaceAware(false);
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");

DocumentBuilder docBuilder=null;
try {
docBuilder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
}

InputSource inSource = new InputSource();
inSource.setCharacterStream(new StringReader(exportResult));

org.w3c.dom.Document domdoc = null;
try {
domdoc = (org.w3c.dom.Document)docBuilder.parse(inSource);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

NodeList nodes = null;

nodes = ((org.w3c.dom.Document)domdoc).getElementsByTagName("<jpeg>");
String contentType = "image/jpeg";
Element tag = (Element)nodes.item(0);
exportResult = getCharacterDataFromElement(tag);

if (exportResult == "") {
nodes = ((org.w3c.dom.Document)domdoc).getElementsByTagName("<gif>");
contentType = "image/gif";
tag = (Element)nodes.item(0);
exportResult = getCharacterDataFromElement(tag);
}
if (exportResult == "") {
this.img = null;
this.jLabel.setText("Фотография отсутствует");
add(this.jLabel);
return;
}

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if ((child instanceof CharacterData)) {
CharacterData cd = (CharacterData)child;
return cd.getData();
}
return "";
}[/CODE]
на
Код:
domdoc = (org.w3c.dom.Document)docBuilder.parse(inSource);
Ругается:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java.io.FileNotFoundException: C:\Program Files\IBM\Lotus\Notes\framework\xmlschemas\domino_8_5_2.dtd (Системе не удается найти указанный путь.)</div></div><div class="sp-body"><div class="sp-content"> at java.io.FileInputStream.<init>(FileInputStream.java:112)
at java.io.FileInputStream.<init>(FileInputStream.java:72)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.jav
a:161)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at LNUserPhoto.notesAppletInit(LNUserPhoto.java:112)
at lotus.domino.JAppletBase.init(Unknown Source)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:460)
at java.lang.Thread.run(Thread.java:736)
domdoc = (lotus.domino.Document)docBuilder.parse(inSource)
java.lang.NullPointerException
at LNUserPhoto.notesAppletInit(LNUserPhoto.java:124)
at lotus.domino.JAppletBase.init(Unknown Source)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:460)
at java.lang.Thread.run(Thread.java:736)
Начало xml:
<!--shcode--><pre><code class='xml'><?xml version='1.0'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_8_5_2.dtd'>
<document xmlns='http://www.lotus.com/dxl' version='8.5' maintenanceversion='2.0'
replicaid='C325728A0024B208' form='TestRT'>[/CODE]Видимо и схему он ищет...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#3
как понял она ищет ДТД от 8.5.2 - а оно там есть?
 

susinmn

Well-known member
16.10.2007
529
3
#4
как понял она ищет ДТД от 8.5.2 - а оно там есть?
Вот же пишет
Код:
java.io.FileNotFoundException: C:\Program Files\IBM\Lotus\Notes\framework\xmlschemas\domino_8_5_2.dtd (Системе не удается найти указанный путь.)
и dxl посмотрел, начинается с
Код:
<?xml version='1.0'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_8_5_2.dtd'>
<document xmlns='http://www.lotus.com/dxl' version='8.5' maintenanceversion='2.0'
replicaid='C325728A0024B208' form='TestRT'>Language: auto html
На клиенте такого файла нет, нужно его игнорировать, но как?

P.S.: Вот dxlExporter.setOutputDOCTYPE(false) походу, нашел. Сейчас проверю.

Проверяю, нормально. +Тэги нужно было указывать не <gif>, а gif.
 

susinmn

Well-known member
16.10.2007
529
3
#5
Далее вопрос. Как внутренность <notesbitmap> </notesbitmap> превраить в картинку? С jpeg работает...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#6
опция - exporter.setConvertNotesBitmapsToGIF(true)
и юзать гиф
оно и так картинка - если с ней ничего не надо делать :)

Добавлено:
Вот dxlExporter.setOutputDOCTYPE(false) походу, нашел. Сейчас проверю.
об этом я и говорил -
дхл эксопртеру сказать - шобы ДТД не мацал smile.gif
но это не хорошо (в общем случае)
 

susinmn

Well-known member
16.10.2007
529
3
#7
Спасибо, получилось. Но bitmap при конвертации теряет цвета. Можно ли это исправить?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#8
честно говоря не обращал внимания :), но это неудивительно
Изображение в формате GIF хранится построчно, поддерживается только формат с индексированной палитрой цветов. Стандарт разрабатывался для поддержки 256-цветовой палитры.
здесь важно понять - что делаем с картинкой (почему не устроил notesbimap)?
 

susinmn

Well-known member
16.10.2007
529
3
#9
здесь важно понять - что делаем с картинкой (почему не устроил notesbimap)?
Как содержимое тега <notesbimap> в аплете превратить в картинку?
Выгрузил документ в DXL через LS, на основе содержимого попробовал создать файл .bmp, картинка не отображается...

В аплете с содержимым jpeg или gif делаю так (contentType или "image/jpeg" или "image/gif")
Код:
	 MIMEEntity mimeEntity = abDoc.createMIMEEntity();
Stream stream = session.createStream();
stream.writeText(exportResult,Stream.EOL_CRLF);
//mimeEntity.setContentFromText(stream, contentType, 1727);
mimeEntity.setContentFromText(stream, contentType, MIMEEntity.ENC_BASE64);
Stream stream2 = session.createStream();
mimeEntity.decodeContent();
mimeEntity.getContentAsBytes(stream2);
stream2.setPosition(0);

this.img = Toolkit.getDefaultToolkit().createImage(stream2.read());
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#10
вот оно чё...
notesbitmap - проприетарь и его формат одному ИБМ ведом (ну могет кто хакал, но с ИБМ судиться...)
коротко - методов я не знаю
хотя... у ИБМ ведь как-то преобразуют, в хэПагах, отображение имеджей (из РТ), теоретически можно откопать их декодер в классах