Создание пользовательской функции XPath для изменения набора узлов в Java

Я создаю пользовательскую функцию XPath в Java, которая изменяет текстовые узлы в наборе узлов. Мне нужно передать набор узлов, выполнить цикл кода через каждый узел и вернуть набор узлов. Я видел много примеров пользовательских функций XPath, которые изменяют строки, но ни один из них не принимает набор узлов и не возвращает его успешно. Я также не знаю, как сопоставить возвращаемый набор узлов.

Возьмем, к примеру, этот исходный XML.

<Library>
    <Bookshelf>
        <Book>alice in wonderland</Book>
        <Book>the giving tree</Book>
            <Author>shel silverstein</Author>
    </Bookshelf>
</Library>

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

<Library>
    <Bookshelf>
        <Book>Alice In Wonderland</Book>
        <Book>The Giving Tree</Book>
            <Author>Shel Silverstein</Author>
    </Bookshelf>
</Library>

Самое главное здесь то, что я хочу реализовать это как пользовательскую функцию XPath с использованием Java, чтобы ее можно было перетаскивать в режиме конструктора. И я использую файловый адаптер с каждой стороны этого преобразования, поэтому структура всех узлов уже задана, и мне нужно привести свои результаты в соответствие.


person kel_ff0080    schedule 16.01.2015    source источник


Ответы (1)


Вам нужно создать собственную реализацию NodeList. Что-то вроде того, что я использую:

package org.gramar.model;

import java.util.List;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class NodeArray implements NodeList {

    private Node nodes[];

    public NodeArray(Node[] nodes) {
        this.nodes = nodes;
    }

    public NodeArray(List<Node> nodes) {
        this.nodes = new Node[nodes.size()];
        nodes.toArray(this.nodes);
    }

    @Override
    public Node item(int index) {
        return nodes[index];
    }

    @Override
    public int getLength() {
        return nodes.length;
    }

}

Ваш код XPathFunction будет иметь что-то вроде этого:

ArrayList<Node> nodes = ... logic to gather the nodes you want to return
return new NodeArray(nodes);
person Chris Gerken    schedule 05.09.2015