Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Антивирус Касперского Personal 5.0.303 beta 2
Xilisoft 3GP Video Converter v2.1.52.831b
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> XML -> Спецификация новейшего языка разметки XML


Язык XML. DOM совместимые анализаторы

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

   Одним из доступных на сегодня DOM-совместимых наборов классов для работы с документами является библиотека com.ibm.dom, входящая в состав XML анализатора xml4j от IBM. Принцип использования DOM интерфесов по сравнению с IE5 практически не изменился - поменялись только названия объектов и методов. Их краткий обзор представлен в следующей таблице.

   

Node

Базовый интерфейс для остальных элементов объектной модели XML, представляющий узел дерева структуры документа.

Document

Используется для получения информации о документе и изменения его структуры. Это интерфейс представляет собой корневой элемент XML документа и содержит методы доступа ко всему содержимому документа. При помощи методов объекта Document в программе можно создавать дочерние объекты, представляющие различные конструкции документа (например, createElement - создание элемента, createComment - создание комментария, createTextNode - текстового фрагмента), удалять, перемещать, добавлять объекты (removeChild, replaceChild, insertBefore, ...), перемещаться по дереву элементов(getFirstChild, getLastChild, getNextSibling, getParentNode, getPreviousSibling, ...), получать элементы по их названию (getElementsByTagName, :) и т.д. В объектной модели IE5 этот интерфейс доступен для сценариев на JScript, VB через объект XMLDOMDocument

Element

Представляет элемент документа, определяя методы доступа к его названию(getTagName, getElementsByTagName), атрибутам (getAttribute, getAttributeNode, setAttribute, removeAttribute, : ) и дочерним элементам(appendChild, getChildNodes, getFirstChild, ...).

Attr

Интерфейс, представляющий атрибут элемента. Имеет методы для получения(getValue) и установления(setValue) значения атрибута. Хотя согласно синтаксису XML атрибуты должны назначаться только элементам, в DOM возможно их создание любым объектом, наследующим интерфейс Node. Поэтому можно создать атрибут для документа, который будет находится в списке атрибутов, но не принадлежать ни одному из его элементов.

CharacterData

Интерфейс, предоставляющий доступ к текстовым данным документа. В XML документе к этому типу данных относятся комментарии, текстовое содержимое элементов, секции CDATA. При помощи методов этого интерфейса можно добавлять, удалять, редактировать данные(appendData, deleteData, replaceData, setData), получать размер области текста (getLength) и извлекать текстовое содержимое(getData, substringData, ...)

Comments

Интерфейс для доступа к тексту комментариев

Text

Представляет текстовое содержимое элемента

CDATASection

Интерфейс, представляющий секции CDATA - фрагментов документа, заключенные в символы "[[" и "]]>", которые не обрабатываются XML-анализатором и поэтому могут содержать символы, "запрешенные" в спецификации XML. В эту область можно, к примеру, помещать стилевые таблицы или JavaScript сценарии, используемые при отображении HTML страницы.

ProcessingInstruction

Предоставляет доступ к т.н. области "инструкций процессора", данные из которой используются XML-анализатором при разборе документа. Доступ к этим данным возможен при помощи методо getData, setData и getTarget

Notation

Определяет инструкцию DTD описания. Для получения ее идентификаторов используются методы getPublicId и getSystemId . DOM Level 1 не поддерживает прямого доступа к DTD декларациям по записи и сейчас они доступны лишь для чтения (при помощи параметра nodeName интерфейса Node)

   В следующем примере демонстрируется использование 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 ");

    }

}


[   ВЕРНУТЬСЯ К ОГЛАВЛЕНИЮ   ]
 
Популярные книги

SQL для "чайников", 5-е издание

Подробнее

Практические работы по Excel на уроках информатики

Подробнее

Проектирование реляционных баз данных. Просто и доступно

Подробнее

 
 
 
Новости ИТ
08.09.2008  Автор оригинальной версии СУБД MySQL покинул Sun
08.09.2008  Samsung: «Blu-ray осталось пять лет»
07.09.2008  Микросхемы, защищенные от «клонирования», стали доступны гражданским заказчикам
07.09.2008  Zepto Hydra A17: бескомпромиссный игровой ноутбук
07.09.2008  Экологичные ноутбуки ASUS Bamboo представлены официально
07.09.2008  Dell планирует полную распродажу производства ПК
07.09.2008  Обновление планов Intel по выпуску CPU архитектуры Nehalem
07.09.2008  Начались продажи нетбуков MSI Wind с батареей удвоенной емкости
07.09.2008  Серия «самых умных ускорителей» ASUS пополнилась моделью ROG EN9800GT MATRIX/HTDI/512M
07.09.2008  Evo-G Mouse Anchor борется с нежелательными перемещениями проводной мыши
07.09.2008  GIGABYTE Radeon HD 4850 Multi-Core Cooling: сочетание мощи и полного отсутствия шума
07.09.2008  CNET: подписочной модели в iTunes пока не будет
07.09.2008  МТС тоже будет продавать iPhone в России
07.09.2008  Фото iPod nano 4G?
06.09.2008  "Олма" вложит $30 млн в интернет-проекты
06.09.2008  Firefox 3.1 Alpha 2
06.09.2008  Scythe Hard Disk Stabilizer x4 поможет тем, кому мало места для жёстких дисков
06.09.2008  Карты Sony Memory Stick PRO-HG Duo HX: подарок любителям экзотичных форматов
06.09.2008  Второе поколение SSD Patriot Warp имеет высокие скорости чтения и записи
06.09.2008  Линейка GPGPU-решений AMD дополнилась ускорителем FireStream 9250, который будет доступен в этом месяце

 
Полезно
 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100  
Besucherzahler myyearbook.com
счетчик посещений