Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / XML /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


DOM совместимые анализаторы - Программирование от RIN.RU
DOM совместимые анализаторы



В следующем примере демонстрируется использование DOM-объектов для вывода содержимого XML документа в двух форматах - в виде дерева элементов и обычной HTML страницы. Немного изменив пример, можно заставить программу сохранять выходной формат в файле и мы получим таким образом обычный XML-HTML конвертор.




/*
Пример использования DOM анализатора.
Демонстрируется возможность рекурсивного обхода дерева элементов,
создание новых элементов, фильтрация элементов (поиска по параметрам)
*/


import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.*;


import org.w3c.dom.*;


import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.ParserFactory;


import com.ibm.xml.parsers.DOMParser;


public class logParser {


static String defaultParser = "com.ibm.xml.parsers.DOMParser";
static String urlLog;
static Document xmldoc = null;
static PrintWriter out;


/*
Конструктор нашего класса- обработчика.
В нем создается выходной поток для печати
*/


public logParser(String url){
urlLog = url;


try {
out = new PrintWriter(new OutputStreamWriter(System.out, "koi8-r"));
}
catch (UnsupportedEncodingException e) {
System.err.println(e.toString());
}


}


public void parseDoc(){
parseDoc(defaultParser);
}


/*
Создание класса анализатора, обрабтка им XML-документа
и создание объектной модели документа
*/


public void parseDoc(String parserName){


try {
Parser parser = ParserFactory.makeParser(parserName);
parser.parse(urlLog);


// Получение указателя на корневой элемент документа
xmldoc = ((DOMParser)parser).getDocument();


}
catch (Exception e) {
System.err.println(e.toString());
}
}


//==========================================================================
// Вывод содержимого документа в виде форматированного списка XML- элементов
//========================




public void viewLogAsXML(){


try {


viewLogAsXML(xmldoc,"");


}
catch (Exception e) {
System.out.println(e.toString());
}
out.flush();


}


/*
Рекурсивный обход элементов документа, начиная с указанного
элемента node.
*/


public void viewLogAsXML(Node node,String offs){


if (node == null) {
return;
}
int type = node.getNodeType(); // Получение информации о типе текущего узла
switch (type) {
/* Если текщий узел - корневой элемент документа */


case Node.DOCUMENT_NODE: {
out.println("<?xml version=\"1.0\" encoding=\"koi-8\"?>");
viewLogAsXML(((Document)node).getDocumentElement(),offs);
out.flush();
break;
}


/* Если текщий узел - элемент */


case Node.ELEMENT_NODE: {
out.print(offs+"<");
// Печать названия элемента
out.print(node.getNodeName());
// Получение списка атрибутов текущего элемента


NamedNodeMap attrs = node.getAttributes();
Node attr;
for (int i = 0; i < attrs.getLength(); i++) {
attr = attrs.item(i);
out.print(" ");
out.print(attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
}
out.println(">");


// Получение списка дочерних элементов
NodeList children = node.getChildNodes();


// Если у текщего элемента есть дочерние, то выводим и их


if (children != null) {
int len = children.getLength();
for (int i = 0; i < len; i++) {
viewLogAsXML(children.item(i),offs+" ");
}
}
break;
}


/* Если текщий узел - текстовый */
case Node.TEXT_NODE: {
out.println(offs+node.getNodeValue());
break;
}


}
// Печать закрывающего тэга элемента
if (type == Node.ELEMENT_NODE) {
out.print(offs+"</");
out.print(node.getNodeName());
out.println(">");
}


}




//=======================================================
// Вывод в формате HTML
//=====================


/* Вызов рекурсивного обходчика */


public void viewLog(){


// Header
viewAsHTML("All log records:");


try {


// Вывод содержимого
viewLog(null);


}
catch (Exception e) {
System.out.println(e.toString());
}


// Header
viewAsHTML();


}




/* Печать только сообщений об ошибках */


public void viewErrors(){


// Header
viewAsHTML("Log errors:");


try {
// Вывод содержимого
viewLog("error");
}
catch (Exception e) {
System.out.println(e.toString());
}
// Footer
viewAsHTML();


}




/*
Рекурсивный обход элементов, у которых атрибут type равен заданному.
*/


public int viewLog(String type){




int i=0;
int elemNum=0;
int messageCount=0;
Element elem;
NodeList elements;


elements = xmldoc.getElementsByTagName("event");
if(elements==null) System.out.println("Empty element collection");


elemNum = elements.getLength();


if (type == null) {


for (i = 0; i < elemNum; i++) {
if(elements.item(i)==null) System.out.println("Empty element");
viewLogMessage((Element)elements.item(i));
}
messageCount=elemNum;


}
else {
for (i = 0; i < elemNum; i++) {
elem = (Element)elements.item(i);


if(elem.getAttribute("type")==type){
messageCount++;
viewLogMessage(elem);
}


}
}
return messageCount;
}


/* Печать заголовка таблицы */


public void viewAsHTML(String title){
out.println("<html>");
out.println("<head><title>Log parser sample
</title></head>");
out.println("<body><br><b>"+
title+"</b><hr>");
out.println("<table cellspacing=\"2\"
cellpadding=\"2\" border=\"1\"
width=\"600\">");
out.println("<tr bgcolor=\"silver\"><th>
IP</th><th>Date</th><th>Method</th>
<th>Request</th><th>Response</th>
</tr>");
}


/* Печать комментариев к таблице */


public void viewAsHTML(){
Date d = new Date();
String date = new String(""+d.getHours()+":"+
d.getMinutes()+":"+d.getSeconds());
out.println("</table><hr>generated by logParser
at <i>"+date+"</i><br>
</body></html>");
out.flush();
}


/* Форматированный вывод содержимого элемента event */


public void viewLogMessage(Element elem){


/*
Получение текста внутри элемента - обращаемся к первому
дочернему узлу (им должен оказаться текст) и получаем его
значение, используя метод getNodeValue() интерфейса Node
*/


String str_from=(elem.getElementsByTagName("ip-from")).item(0).
getFirstChild().getNodeValue();
String str_method=(elem.getElementsByTagName("method")).item(0).
getFirstChild().getNodeValue();
String str_to=(elem.getElementsByTagName("url-to")).item(0).
getFirstChild().getNodeValue();
String str_result=(elem.getElementsByTagName("response")).item(0).
getFirstChild().getNodeValue();


out.println("<tr><td>"+str_from+"
</td><td>"+elem.getAttribute("date")+
"</td><td>"+str_method+"</td><td>"+
str_to+"</td><td>"+str_result+
"</td></tr>");


}




//=======================================================
// Модификация дерева элементов
//=============================


public void logMessage(String result, String datetime,
String method, String ipfrom, String urlto, String response){


if(xmldoc==null) return;


Element root = xmldoc.getDocumentElement();
Element log_elem = xmldoc.createElement("event");
log_elem.setAttribute("result",result);
log_elem.setAttribute("date",datetime);


Element elem;
Text elem_value;


elem = xmldoc.createElement("method");
elem_value = xmldoc.createTextNode(method);
elem.appendChild(elem_value);
log_elem.appendChild(elem);


elem = xmldoc.createElement("ip-from");
elem_value = xmldoc.createTextNode(ipfrom);
elem.appendChild(elem_value);
log_elem.appendChild(elem);


elem = xmldoc.createElement("url-to");
elem_value = xmldoc.createTextNode(urlto);
elem.appendChild(elem_value);
log_elem.appendChild(elem);


elem = xmldoc.createElement("response");
elem_value = xmldoc.createTextNode(response);
elem.appendChild(elem_value);
log_elem.appendChild(elem);


root.appendChild(log_elem);
}




//=======================================================
// Пример использования методов класса logParser
//==============================================


public static void main(String argv[]) {


/*
Создание объекта анализатора. В качестве параметра ему
передается название документа(можно и через командную строку, конечно...)
*/


logParser log_file = new logParser("log.xml");
log_file.parseDoc(); // Анализ документа


if (argv.length == 0) { // Что с ним делать
log_file.viewLogAsXML();
System.exit(0);
}


for (int i = 0; i < argv.length; i++) {
String arg = argv[i];


if (arg.startsWith("-")) {
if (arg.equals("-vx")) {
log_file.viewLogAsXML();
break;
}
if (arg.equals("-va")) {
log_file.viewLog();
break;
}
if (arg.equals("-ve")) {
log_file.viewErrors();
break;
}


if (arg.equals("-h")) {
usage();
}
}
}




log_file.logMessage("success","12","GET","127.0.0.1","./index.html","200");
log_file.viewLogAsXML();




}
private static void usage() {


System.err.println("usage: java logParser (options)");
System.err.println();
System.err.println("options:");
System.err.println(" -vx View result as XML tree (default)");
System.err.println(" -va View all messages as HTML page");
System.err.println(" -ve View only errors as HTML page");
System.err.println(" -h View help ");


}


}



Комментарии


Более подробные комментарии, файлы приложений и результатов их работы можно найти по адресу www.mrcpk.nstu.ru/xml/

<<<  Назад
 1  2 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Для чего нужен новый язык разметки?

Как выглядит XML-документ?

Правила создания XML- документа

Конструкции языка

Приложение 1. Пример XML-документа

Описание технологии

Просмотр XML - документов

Приложение 2. JavaScript сценарий, обрабатывающий XML-документ, приведенный в приложении 1

Стилевые таблицы XSL

DTD - определения

Схемы данных

XML в Microsoft Internet Explorer 5.0

Использование Java XML-обработчиков

Приложение 3. Пример XSL-документа

Приложение 4. DTD-определения для XML-документа приложения 1

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь