Как реализовать CachedExpr в парсере VTD-xml

Я хочу загрузить все XPath и переменные в CachedExpr сразу и использовать их несколько раз. кто-нибудь может предоставить образцы для добавления переменных и XPath в CachedExpr, а также сообщить мне, как объявить в нем XPathNamespace.

public class VTDParser {
private final CustomAutoPilot autoPilot;

public static class CustomAutoPilot extends com.ximpleware.AutoPilot {
    final Hashtable<String, com.ximpleware.Expr> variables = new Hashtable<>();

    public CustomAutoPilot() {
        super();
    }

    public CustomAutoPilot(VTDNav v) {
        super(v);
    }

    public void declareVariableExpr(String varName, String varExpr) throws XPathParseException {
        try {
            parser p = new parser(new StringReader(varExpr));
            p.nsHash = nsHash;
            p.symbolHash = variables;
            xpe = (com.ximpleware.Expr) p.parse().value;
            variables.put(varName, xpe);
            ft = true;
        } catch ( XPathParseException e ) {
            throw e;
        } catch ( Exception e ) {
            throw new XPathParseException("Error occurred");
        }
    }

    @Override
    public void selectXPath(String s) throws XPathParseException {
        try {
            parser p = new parser(new StringReader(s));
            p.nsHash = nsHash;
            p.symbolHash = variables;
            xpe = (com.ximpleware.Expr) p.parse().value;
            ft = true;
            if ( enableCaching )
                xpe.markCacheable();
        } catch ( XPathParseException e ) {
            throw e;
        } catch ( Exception e ) {
            throw new XPathParseException("");
        }
    }

    public VTDNav getNavigationObject() {
        return vn;
    }
}

public VTDParser(String message) throws ParseException {
    try {
        VTDGen vg = new VTDGen();
        byte[] content = message.getBytes(Charset.defaultCharset());
        vg.setDoc(content);
        vg.parse(true);
        VTDNav vn = vg.getNav();
        autoPilot = new CustomAutoPilot(vn);
        autoPilot.declareXPathNameSpace("prefix", "http://www.w3.org");
    } catch ( ParseException e ) {
        throw e;
    }
}

public String asString(String xpath) throws XPathParseException {
    try {
        autoPilot.selectXPath(xpath);
        return autoPilot.evalXPathToString().trim();
    } catch ( XPathParseException e ) {
        throw e;
    }
}

public void variable(String name, String value) throws XPathParseException {
    try {
        autoPilot.declareVariableExpr(name, value);
    } catch ( XPathParseException e ) {
        throw e;
    }
}

public static void main(String[] args) throws ParseException, XPathParseException {
    String xml = "<tree><fruit> Mango</fruit></tree>";
    VTDParser parser = new VTDParser(xml);
    System.out.println(parser.asString("//tree/fruit"));
}

}

Мы написали класс CustomAutopilot, который успешно анализируется. МЫ хотим скомпилировать список xpath в CachedExpr и повторно использовать его вместо компиляции каждый раз.


person zulu    schedule 31.10.2016    source источник
comment
Я не думаю, что CachedExpr - это то, с чем вы взаимодействуете напрямую... как только он включен (что по умолчанию), он будет работать так, как вы указали по умолчанию... XPathNamespace объявляется с помощью AutoPilot... как и любая обычная оценка xpath. ..   -  person vtd-xml-author    schedule 31.10.2016


Ответы (1)


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

Его цель состоит в том, чтобы кэшировать вывод предыдущего оцененного результата оценки XPath (обычно этих абсолютных выражений), когда эти результаты необходимы несколько раз, но вы не хотите тратить циклы на каждую повторную оценку.

Рассмотрим следующее выражение:

//а[текст()=//б]

для каждой оценки //a вам нужно будет оценить предикат [text()=//b]... поэтому какое выражение кеша сохранит результат //b и повторно использует его для последующей оценки предиката...

Если ваша цель состоит в том, чтобы сохранить предварительно скомпилированное выражение XPath... я предлагаю использовать хэш-карту (или таблицу), вы можете использовать строку xpath в качестве ключа и autoPilot в качестве значения... но есть много способов сделать это. .

person vtd-xml-author    schedule 01.11.2016
comment
мы пытаемся улучшить производительность анализа xpath. Другой вопрос, есть ли другой способ использовать создание или загрузку индекса на лету вместо записи в физический файл на диск? - person zulu; 02.11.2016
comment
производительность синтаксического анализа xpath имеет значение только в том случае, если вы имеете дело с небольшими файлами xml или зацикливанием... всегда предварительно компилируйте xpath... никогда не помещайте его в цикл... предварительно компилируйте и повторно используйте (т.е. вызывая autoPilot.resetXPath())... . - person vtd-xml-author; 02.11.2016
comment
создание и загрузка индекса всегда относится к аспекту персистентности VTD... другими словами, речь всегда идет о чтении и записи на диск (жесткий диск или флэш-память)... если вы не собираете мусор на выходе синтаксического анализа, что означает он будет занимать место в ОЗУ... в первую очередь, о чтении индекса не может быть и речи, верно? - person vtd-xml-author; 02.11.2016
comment
Есть ли способ обрезать результат следующего метода autoPilot.evalXPathToString(). Мы обрезаем пробелы на обоих концах, используя метод String. У нас есть какой-нибудь метод в VTDNav? . Я видел метод enableIgnoredWhiteSpace в классе VTDGen. Для чего используется синица? - person zulu; 02.11.2016
comment
Поскольку вы говорите только об обрезке одной строки val ... я не думаю, что это имеет большое значение ... да, я думаю, что у VTDNav есть метод, который делает что-то для этого, называется toStringNormalized () ... но на самом деле, за исключением вывода отладочного сообщения, я хочу, чтобы вы спросили себя... зачем вам нужно выполнять такую ​​операцию активации строки в первом пробеле... весь смысл VTD в том, что такие операции редко нужны для вашего приложения. функция... подумайте об этом на мгновение - person vtd-xml-author; 03.11.2016