
- •Лекция 4-06
- •Тема 5.2. Обработка документов xml с использованием Java
- •Тема 5.2. Обработка документов xml с использованием Java
- •5.2.1. Обработка документов xml
- •5.2.2. СинтаксическиеSax-анализаторыXml
- •5.2.3. РеализацияDomxmLв языкеJava
- •5.2.3.1. Доступ к документу xml
- •5.2.3.1.1. Класс DocumentBuilder
- •5.2.3.1.2. КлассDocumentBuilderFactory
- •5.2.3.2. Интерфейсы dom xml в языкеJava
- •5.2.3.2.1. ИнтерфейсDomImplementation
- •5.2.3.2.2. ИнтерфейсNodeList
- •5.2.3.2.3. ИнтерфейсNamedNodeMap
- •5.2.3.2.4. ИнтерфейсNode
- •5.2.3.2.5. ИнтерфейсыDocument,DocumentFragmentиDocumentType
- •Тема 1: 'Поздравление'
- •5.2.3.2.6. ИнтерфейсElement
- •5.2.3.2.7. ИнтерфейсAttr
- •5.2.3.2.8. Интерфейсы CharacterData, Text, Comment и cdataSection
- •5.2.3.2.9. ИнтерфейсыEntity,EntityReference,NotationиProcessingInstruction
- •5.2.3.2.10. ИсключениеDomException
- •5.2.3.3. Средства выполнения преобразований документовXmLв языкеJava
- •5.2.3.3.1. Общие средства выполнения преобразований документовXml
- •5.2.3.3.2. Средства преобразования дляDom-анализатора
- •5.2.3.3.3. Средства преобразования для потоков ввода-вывода
5.2.3.2.6. ИнтерфейсElement
Интерфейс Elementдобавляет к методам своего родительского элементаNodeметоды работы с атрибутами элемента XML и методы, позволяющие обратиться к вложенным элементам.
Метод
public String getTagName()
возвращает имя элемента.
Методы
public NodeList getElementsByTagName(String name)
public NodeList getElementsByTagNameNS(String namespaceURI,
String localName)
позволяют получить коллекцию дочерних узлов данного элемента либо с заданным именем name, либо с заданнымURIпространства именnamespaceURIи локальным именемlocalName.
Проверить наличие у элемента атрибута с именем name, либо по заданномуURIпространства именnamespaceURIи локальному имениlocalNameможно с помощью методов
public boolean hasAttribute(String)
public boolean hasAttributeNS(String namespaceURI,
String localName).
Получить атрибут в виде объекта типа Attrили его значение в виде строки по имениname, либо по заданномуURIпространства именnamespaceURIи локальному имениlocalNameможно с помощью методов
public Attr getAttributeNode(String name);
public Attr getAttributeNodeNS(String namespaceURI,
String localName)
public String getAttribute(String name);
public String getAttributeNS(String namespaceURI,
String localName).
Установить значение атрибута valueможно с помощью методов
public void setAttribute(String name, String value)
throws DOMException
public void setAttributeNS(String namespaceURI,
String qualifiedName, String value)
throws DOMException.
Создание нового атрибута как узла типа Attrили изменение существующего узла типаAttrвыполняется с помощью методов
public Attr setAttributeNode(Attr newAttr)
throws DOMException
public Attr setAttributeNodeNS(Attr newAttr)
throws DOMException
Первый метод добавляет или замещает узел по его имени, второй – по URIпространства имен и локальному имени.
Удалить атрибут с именем name, либо с заданнымURIпространства именnamespaceURIи локальным именемlocalNameможно с помощью методов
public void removeAttribute(String name)
throws DOMException
public void removeAttributeNS(String namespaceURI,
String localName) throws DOMException.
Удаление атрибута как узла типа Attr с именем name выполняется с помощью метода
public Attr removeAttributeNode(Attr name)
throws DOMException.
Примеры использования методов интерфейса Element:
1. Вывести отправителей и тему для сообщений электронной почты, получателем которой является ivanov@mail.com:
// Получение списка элементов to в emailDoc
NodeList toMessageList =
emailDoc.getElementsByTagName("to");
// Получение количества элементов to
int toNumber = toMessageList.getLength();
// Получение списка элементов from в emailDoc
NodeList fromMessageList =
emailDoc.getElementsByTagName("from");
// Получение списка элементов subject в emailDoc
NodeList subjectToList =
emailDoc.getElementsByTagName("subject");
// Вывод заголовка
System.out.println("Вывод почты дляivanov@mail.com");
// Получение адресатов в цикле
for (int i=0; i < toNumber;i++) {
// Получение текущего элемента to
Element currentTo = (Element)toMessageList.item(i);
// Получение значения атрибута value
// в текущем элементе to
String currentToValue =
currentTo.getAttribute("value");
// Если получателем является ivanov@mail.com
if(currentToValue.equals("ivanov@mail.com")) {
// Получение текущего элемента from
Element currentFrom =
(Element)fromMessageList.item(i);
// Получение значения атрибута value
// в текущем элементе from
String currentFromValue =
currentFrom.getAttribute("value");
// Получение текущей темы
String currentSubjectValue =
subjectList.item(i).getFirstChild().getNodeValue();
// Вывод сведений о сообщении
System.out.println(" Сообщение " + (i+1) + ":\n" +
"Отправитель:" + currentFromValue + "\n" +
"Тема:" + currentSubjectValue);
}
}
Вывод этого фрагмента программы будет иметь следующий вид:
Вывод почты дляivanov@mail.com
Сообщение 3:
Отправитель:sidorov@mail.com
Тема: Отказ
Сообщение 5:
Отправитель:sidorov@mail.com
Тема: Ответ
2. Добавить в документе newEmailDocв элементыmessageатрибутid, а в элементыheader– атрибутыfrom,toиsubject:
// Получение списка элементов message в newEmailDoc
NodeList newMessageList =
newEmailDoc.getElementsByTagName("message");
// Установка атрибута id для элементов message в цикле
for (int i=0; i < newMessageList.getLength();i++) {
// Получение текущего элемента message
Element currentMsg = (Element)newMessageList.item(i);
// Создание узла аттрибута id
Attr idAttr = newEmailDoc.createAttribute("id");
// Задание значения для узла атрибута id
idAttr.setValue("msg" + (i+1));
// Установка атрибута id для
// текущего элемента message
currentMsg.setAttributeNode(idAttr);
}
// Массив отправителей писем
String [] fromArray =
{"petrov@mail.com","sidorov@mail.com"};
// Массив получателей писем
String [] toArray =
{"sidorov@mail.com","petrov@mail.com"};
// Массив тем писем
String [] subjectArray =
{"Напоминание","Благодарность"};
// Получение списка элементов header в newEmailDoc
NodeList newHeaderList =
newEmailDoc.getElementsByTagName("header");
// Установка атрибутов для элементов header в цикле
for (int i=0; i < newMessageList.getLength();i++) {
// Получение текущего элемента header
Element currentHeader =
(Element)newHeaderList.item(i);
// Установка значения атрибута from
// для текущего элемента header
currentHeader.setAttribute("from", fromArray[i]);
// Установка значения атрибута to
// для текущего элемента header
currentHeader.setAttribute("to", toArray[i]);
// Установка значения атрибута subject
// для текущего элемента header
currentHeader.setAttribute("subject",
subjectArray[i]);
}
Полученный в результате выполнения этого фрагмента программы документ XML примет следующий вид:
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<new-email-folder>
<message id="msg1">
<!--Сообщение 1-->
<header from="petrov@mail.com"
subject="Напоминание" to="sidorov@mail.com"/>
<body>Завтра зачет по физике.</body>
</message>
<message id="msg2">
<!--Сообщение 2-->
<header from="sidorov@mail.com"
subject="Благодарность" to="petrov@mail.com"/>
<body>Спасибо, что напомнил</body>
</message>
</new-email-folder>