Node java что это

от admin

Node java что это

supportsParent returns true if this node supports the parent relationship.

Some XML tree implementations are singly linked and only support downward navigation through children relationships. The default case is that both parent and children relationships are supported though for memory and performance reasons the parent relationship may not be supported.

getParent

getParent returns the parent Element if this node supports the parent relationship or null if it is the root element or does not support the parent relationship.

This method is an optional feature and may not be supported for all Node implementations.

setParent

setParent sets the parent relationship of this node if the parent relationship is supported or does nothing if the parent relationship is not supported.

This method should only be called from inside an Element implementation method and is not intended for general use.

getDocument

getDocument returns the Document that this Node is part of if this node supports the parent relationship.

This method is an optional feature and may not be supported for all Node implementations.

setDocument

setDocument sets the document of this node if the parent relationship is supported or does nothing if the parent relationship is not supported.

This method should only be called from inside a Document implementation method and is not intended for general use.

isReadOnly

isReadOnly returns true if this node is read only and cannot be modified. Any attempt to modify a read-only Node will result in an UnsupportedOperationException being thrown.

hasContent

hasContent returns true if this node is a Branch (either an Element or a Document) and it contains at least one content node such as a child Element or Text node.

getName

getName returns the name of this node. This is the XML local name of the element, attribute, entity or processing instruction. For CDATA and Text nodes this method will return null.

setName

Sets the text data of this node or this method will throw an UnsupportedOperationException if it is read-only.

getText

Returns the text of this node.

setText

Sets the text data of this node or this method will throw an UnsupportedOperationException if it is read-only.

getStringValue
getPath

Returns the XPath expression which will return a node set containing the given node such as /a/b/@c. No indexing will be used to restrict the path if multiple elements with the same name occur on the path.

getPath
getUniquePath

Returns the XPath expression which will return a nodeset of one node which is the current node. This method will use the XPath index operator to restrict the path if multiple elements with the same name occur on the path.

getUniquePath

Returns the relative unique XPath expression from the given context which will return a nodeset of one node which is the current node. This method will use the XPath index operator to restrict the path if multiple elements with the same name occur on the path.

asXML

asXML returns the textual XML representation of this node.

write

write writes this node as the default XML notation for this node. If you wish to control the XML output (such as for pretty printing, changing the indentation policy etc.) then please use XMLWriter or its derivations.

getNodeType
getNodeTypeName
detach

Removes this node from its parent if there is one. If this node is the root element of a document then it is removed from the document as well.

This method is useful if you want to remove a node from its source document and add it to another document. For example

Node node = . ; Element someOtherElement = . ; someOtherElement.add( node.detach() );

selectNodes

selectNodes evaluates an XPath expression and returns the result as a List of Node instances or String instances depending on the XPath expression.

selectObject

selectObject evaluates an XPath expression and returns the result as an Object . The object returned can either be a List of one or more Node instances or a scalar object like a String or a Number instance depending on the XPath expression.

selectNodes

selectNodes evaluates an XPath expression then sorts the results using a secondary XPath expression Returns a sorted List of Node instances.

selectNodes

selectNodes evaluates an XPath expression then sorts the results using a secondary XPath expression Returns a sorted List of Node instances.

selectSingleNode

selectSingleNode evaluates an XPath expression and returns the result as a single Node instance.

valueOf

valueOf evaluates an XPath expression and returns the textual representation of the results the XPath string-value of this node. The string-value for a given node type is defined in the XPath specification .

numberValueOf

numberValueOf evaluates an XPath expression and returns the numeric value of the XPath expression if the XPath expression results in a number, or null if the result is not a number.

matches

matches returns true if evaluating the given XPath expression on this node returns a non-empty node set containing this node.

This method does not behave like the <xsl:if> element — if you want that behaviour, to evaluate if an XPath expression matches something, then you can use the following code to be equivalent.

if ( node.selectSingleNode( «/some/path» ) != nulll )

createXPath

createXPath creates an XPath object for the given xpathExpression. The XPath object allows the variable context to be specified.

asXPathResult

asXPathResult returns a version of this node which is capable of being an XPath result. The result of an XPath expression should always support the parent relationship, whether the original XML tree was singly or doubly linked. If the node does not support the parent relationship then a new node will be created which is linked to its parent and returned.

accept

accept is the method used in the Visitor Pattern.

clone

clone will return a deep clone or if this node is read-only then clone will return the same instance.

Node java что это

The Node interface is the primary datatype for the entire Document Object Model. It represents a single node in the document tree. While all objects implementing the Node interface expose methods for dealing with children, not all objects implementing the Node interface may have children. For example, Text nodes may not have children, and adding children to such nodes results in a DOMException being raised.

The attributes nodeName , nodeValue and attributes are included as a mechanism to get at node information without casting down to the specific derived interface. In cases where there is no obvious mapping of these attributes for a specific nodeType (e.g., nodeValue for an Element or attributes for a Comment ), this returns null . Note that the specialized interfaces may contain additional and more convenient mechanisms to get and set the relevant information.

The values of nodeName , nodeValue , and attributes vary according to the node type as follows:

Java. Работа с XML-документами

Привет, Хабр! Меня зовут Михаил, я SDET-специалист компании SimbirSoft. Я занимаюсь автоматизацией тестирования, в основном это работа с WEB и REST API. Но на последнем проекте использовался SOAP, поэтому при автоматизации тестирования я работал с сообщениями этого протокола, а именно:

выполнять проверку наличия обязательных атрибутов и тегов SOAP сообщений;

сравнивать содержание различных сообщений;

вносить изменения или генерировать новые сообщения для исходящих запросов.

В своей статье я поделюсь несколькими способами работы с XML-документами. Материал будет полезен тем, кто впервые сталкивается в работе из кода с подобными документами на Java.

Для работы я преобразовывал SOAP сообщения в Java-объекты. Этот процесс называется демаршаллинг. Обратный процесс называется маршаллинг, как десериализация и сериализация JSON.

Отличие маршалинга от сериализации заключается в том, что сериализация предполагает упаковку лишь данных программы. Например, при сериализации объекта класса, состоящего из полей и различных методов, сохраняться будет информация только о полях, а о методах — нет.

При маршалинге объекта запишется не только информацию о его данных (полях), но и информация по восстановлению структуры объекта — класс объекта, либо его мета-информацию для реконструирования типа.

В Java существует множество инструментов и способов преобразования документов формата XML в объекты. Я выбирал между использованием JAXB и DOM.

В качестве примера приведу XML-документ со следующим содержанием:

Это описание экрана некоторого продукта.

Корневым элементом является <Screen>, содержащий в себе теги заглавия, описания экрана, а также блок кнопок и несколько атрибутов.

Кнопки, в свою очередь, содержат заглавия и различное количество подсказок. В некоторых тегах есть атрибуты, описывающие состояние и цвет элемента. А также команду “Action”, которую необходимо использовать при выполнении запроса на определенное действие.

У данного продукта все формируемые экраны соответствуют единой схеме, отличия могут быть в содержании тегов, их количестве и значениях атрибутов. К примеру, на экране может быть больше или меньше кнопок с различными состояниями, атрибутами и др.

Читать:
Как построить иерархию классов

JAXB (Java Architecture for XML Binding) — это специальный инструмент для маршалинга и демаршалинга объектов.

JAXB предоставляет аннотации, которыми размечаются поля JAVA-классов.

Для начала необходимо создать требуемые классы.

Принцип получается примерно следующий: если тег имеет дочерние элементы или атрибуты, значит это объект. Если тег в документе не имеет дочерних элементов, значит это поле объекта.

Корневой класс Screen:

Он содержит в себе три строковых поля: “stage”, “title”, “description” и коллекции “buttonList” и “attributeList”.

3 класса вложенных элементов:

Всего нужно 4 класса.

Теперь нам необходимо разметить наши поля и классы аннотациями, чтобы иметь возможность выполнять операции маршаллинга и демаршаллинга.

В этом случае нам понадобятся следующие аннотации:

— @XmlRootElement(name = «Screen») — определяет корневой элемент. Может быть указана над классом или полем класса;

— @XmlAccessorType(XmlAccessType.FIELD) — определяет сущности, которые используются в процессах преобразования;

— @XmlAttribute(name = «Stage») — определяет, что поле является атрибутом, а не тегом в XML-документе;

— @XmlElement(name = «Title») — определяет, что поле является тегом в XML-документе;

— @XmlElementWrapper(name=»Buttons») — создает некоторую обертку вокруг группы повторяющихся тегов;

— @XMLValue — определяет, что поле содержит в себе значение тега.

Получились следующие классы:

В аннотациях, в параметре “name”, указывается имя тега XML, значение которого мы присваиваем полю объекта при маршаллинге.

А при демаршалинге этот параметр, наоборот, задает имя тега XML для значения поля объекта.

В примере сеттеры и геттеры реализованы через аннотацию Lombok @Data. Но в JAXB они не требуются и не используются. Таким образом, отсутствует возможность редактирования значений полей при преобразованиях. Но они нужны для других стандартных операций с объектами.

Для удобства во всех классах переопределен метод toString(). Вот так этот метод реализован в классе Screen:

В остальных классах он переопределен аналогичным образом.

Классы готовы к работе.

Демаршаллинг

Реализуем чтение документа XML. Для этого используем BufferedReader c чтением из файла и StringReader, который будет считывать созданную строку в процессе преобразования.

После создаем JAXBContext — сущность, которая лежит в основе работы процессов маршаллинга и демаршаллинга. Это точка входа в API JAXB, она предоставляет абстракцию для управления информацией о привязке XML/Java. В качестве параметра при создании указываем класс получаемого объекта — Screen.class.

С помощью JAXBContext создадим Unmarshaller, необходимый для преобразования XML-документа в объект Screen с приведением типа. Для этого в метод unmarshal() передается ранее созданный StringReader:

Результат можно увидеть, развернув объект в окне отладки, или путем выведения в консоль — для чего и переопределялись методы toString().

Это был процесс демаршаллинга. Из документа (сообщения SOAP) получили объект Java с методами для работы, всеми полями и атрибутами.

Маршалинг

Создаем StringWriter, который будет записывать строку.

Также создадим сущность Marshaller с установкой параметров форматирования данных.

Чтобы проверить, что все работает, внесем изменения в полученный ранее объект screen: изменяется заголовок и цвет с описанием для первой кнопки.

После чего в метод marshal() передаем объект и StringWriter:

Теперь writer хранит в себе данные объекта screen в виде строки, с помощью которой можно перезаписать или создать новый XML-документ, либо сгенерировать сообщение SOAP.

Для просмотра результата можно воспользоваться окном отладки или вывести в консоль.

Более подробно с JAXB можно ознакомиться тут.

Второй способ преобразований с использованием DOM (Document Object Model) в сравнении с предыдущим может показаться более трудным и запутанным. Здесь не используются аннотации для поиска и определения тегов и полей классов. При использовании DOM весь XML-документ представлен в виде древовидной структуры. Для перемещения по этой модели, получения узлов, значений имен тегов, их атрибутов и т.д. существуют специальные методы и сущности.

Сначала также создаем классы:

Основное отличие заключается в том, что для хранения атрибутов тега используется HashMap<> attributes. Теперь не важно, какие именно могут быть атрибуты у тега — при преобразовании они все будут добавлены в мапу в формате «ключ-значение».

Здесь гетеры и сеттеры используются при преобразованиях. Можно написать свои и при необходимости реализовать в них изменения входных и выходных параметров.

Для начала немного об определениях некоторых сущностей, которые нам понадобятся.

Важно понять, что основной «атомарной» единицей в этой модели является Node — узел.

Узлом может быть:

Node — класс, который предназначен для любого XML-элемента: текст, тег, или атрибут. Т.е. все в XML есть Node. Далее идет специализация.

NamedNodeMap — сущность, в которой хранятся данные «ключ-значение», она используется при получении атрибутов тега.

NodeList — список узлов, используемый при получении дочерних элементов и узлов с одинаковыми тегами.

Пример кода по заполнению объекта данными из XML-документа с использованием DOM:

Для удобства можно написать специальные классы-парсеры. В приведенном выше коде представлены некоторые методы, которые возможно для этого использовать.

Как такового обратного процесса, как в случае с JAXB, этот способ не подразумевает. Но есть переопределенный метод toString() объекта ScreenDom, который возвращает строку формата XML. Привести ее к нужному формату уже не составит труда.

К дополнению метода описанного выше также используется XPath.

XPath — это язык запросов к элементам XML. Он позволит создать выражение запроса и получить интересующие данные из документа.

В своей работе при тестировании API я использую RestAssured и его поисковые выражения.

Чтобы получить значение «Атрибут №1» из Response RestAssured, можно использовать следующий код:

Поисковое выражение прочитаем следующим образом: во всем документе найти значение первого тега, у которого есть атрибут “A”, равный значению “BC”.

Есть и другие способы и выражения XPath, поддерживаемые RestAssured:

it.@type == ‘специфическое значение’;

Вышеописанный способ отлично подходит для поиска определенных значений в XML-документе. Он не требует создания сущностей Java, применяется довольно легко и быстро. Но стоит отметить, что данный способ не подходит для полного процесса преобразования из документа в объект и обратно.

Более подробно об использовании Xpath в RestAssured вы можете ознакомиться в документации.

Весь код статьи доступен в удаленном репозитории по этой ссылке.

Это рабочий проект, в котором реализованы оба способа маршаллинга и демаршаллинга. Кроме того, в нем реализован тест, пример возможного использования данных методов при автоматизации тестирования сообщений SOAP- или XML-документов.

Заключение

В этой статье я поделился своим опытом в решении некоторых задач, с которыми столкнулся при автоматизации тестирования сообщений SOAP. Это далеко не все способы и инструменты, доступные для преобразования XML на Java. Но они работают и их довольно легко понять и реализовать.

Каждый способ имеет свои плюсы и минусы. Для удобного восприятия я представил их в таблице ниже:

Инструмент

Плюсы

Минусы

JAXB

Прост в реализации.

Отлично подходит, если используется XML-схема.

Возможно частичное использование.

Нужно точно знать возможные атрибуты тегов.

Нет возможности редактировать значения при преобразовании объектов.

DOM

Нет необходимости заранее знать возможные атрибуты тегов.

Возможность редактирования значений при преобразовании объектов.

Гибкость в использовании.

Иногда трудночитаемый код.

В своем случае я выбрал DOM из-за неизвестности атрибутов тегов в получаемых сообщениях SOAP. Мне понадобилась возможность добавлять новые узлы в древовидную структуру документа при преобразованиях. При помощи методов DOM я реализовал классы — парсеры, которые позволили достаточно легко и просто выполнить маршаллинг и демаршлаллинг по необходимым мне условиям.

Надеюсь, эта статья была вам интересна. Спасибо за внимание!

Рекомендуем другие наши SDET-статьи:

Авторские материалы для разработчиков мы также публикуем в наших соцсетях – ВК и Telegram.

The Node Class

As usual when we write a new class, we’ll start with the instance variables, one or two constructors and toString so that we can test the basic mechanism of creating and displaying the new type.

public class Node <
int cargo;
Node next;

public Node () <
cargo = 0;
next = null ;
>

public Node ( int cargo, Node next) <
this .cargo = cargo;
this .next = next;
>

public String toString () <
return cargo + «» ;
>
>

The declarations of the instance variables follow naturally from the specification, and the rest follows mechanically from the instance variables. The expression cargo + «» is an awkward but concise way to convert an integer to a String.

To test the implementation so far, we would put something like this in main :

Node node = new Node (1, null );
System.out.println (node);

The result is simply

To make it interesting, we need a list with more than one node!

Node node1 = new Node (1, null );
Node node2 = new Node (2, null );
Node node3 = new Node (3, null );

This code creates three nodes, but we don’t have a list yet because the nodes are not linked. The state diagram looks like this:

To link up the nodes, we have to make the first node refer to the second and the second node refer to the third.

node1.next = node2;
node2.next = node3;
node3.next = null ;

The reference of the third node is null , which indicates that it is the end of the list. Now the state diagram looks like:

Now we know how to create nodes and link them into lists. What might be less clear at this point is why.

Похожие статьи