Разбор XML VTD. Получить значение на основе тега и атрибута

У меня немного сложный XML.

<?xml version="1.0" encoding="UTF-8"?><test:mark><parent parent_id="1"><child child_id="1_1">11Value</child><child child_id="1_2">12Value</child><child child_id="1_3">13Value</child></parent><other other_id="1"><inner>1233</inner></other></test:mark>

Я очень новичок в VTD, и теперь вместо разбора всего XML с помощью DOM или SAX я хочу получить значение <child child_id="1_2">

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

Ниже то, что я делаю. И не работает!!

VTDGen vtdGen = new VTDGen();
        vtdGen.parseFile("E:/JavaProjects/SampleTestingFiles/SampleXML.xml", true);

        VTDNav vtdNav = vtdGen.getNav();
        AutoPilot autoPilot = new AutoPilot(vtdNav);

        try {
            autoPilot.selectXPath("//parent/child[@child_id='1_2']");
            if(autoPilot.evalXPathToBoolean()) {
                int token = autoPilot.evalXPath();
                if(token != -1) {
                    String value = vtdNav.toNormalizedString(token);
                    System.out.println("The value is - " + value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Если я сделаю что-то вроде autoPilot.selectXPath("//parent/child[@child_id]");. Он выбирает некоторые теги с атрибутом @child_id, но не все.

Любая помощь очень ценится, даже документация о том, как мы должны предоставлять XPATH, может помочь.


person Abhaysinh Bhelke    schedule 31.03.2018    source источник


Ответы (1)


Ваша логика оценки XPath неверна (ваше выражение xpath выглядит нормально)...

if(autoPilot.evalXPathToBoolean()) {
                int token = autoPilot.evalXPath();
                if(token != -1) {
                    String value = vtdNav.toNormalizedString(token);
                    System.out.println("The value is - " + value);
                }
            }

следует переписать как

int i=-1;
while((i=autoPilot.evalXPath())!=-1){
              String value = vtdNav.toNormalizedString(i);
              System.out.println("The value is - " + value);
}
person vtd-xml-author    schedule 31.03.2018
comment
Спасибо за быстрый ответ. Я немного запутался в том, почему нам нужен цикл while, а не условие if, если мы вообще не смещаем узел и нет никаких изменений в i. Как-то мне сложно понять. - person Abhaysinh Bhelke; 01.04.2018
comment
Также проверено с int i=-1; while((i = autoPilot.evalXPath()) == -1) { String value = vtdNav.toNormalizedString(i); System.out.println("The value is - " + value); } Но все же он не входит в цикл while. Поскольку я использую Java, int i=-1; while((i=autoPilot.evalXPath())=-1){ String value = vtdNav.toNormalizedString(i); System.out.println("The value is - " + value); } не компилируется. - person Abhaysinh Bhelke; 01.04.2018
comment
Большое спасибо. С исправлением теперь он дает значение как Child, но не 12Value. - person Abhaysinh Bhelke; 01.04.2018
comment
добавьте text() к выражению, и вы получите его - person vtd-xml-author; 01.04.2018
comment
Потрясающий. Идеально. Спасибо. - person Abhaysinh Bhelke; 01.04.2018
comment
Выкладываю итоговую работу после добавления текста VTDGen vtdGen = new VTDGen(); vtdGen.parseFile("E:/JavaProjects/SampleTestingFiles/SampleXML.xml", true); VTDNav vtdNav = vtdGen.getNav(); AutoPilot autoPilot = new AutoPilot(vtdNav); try { autoPilot.selectXPath("//parent/child[@child_id='1_2']/text()"); int i=-1; while((i=autoPilot.evalXPath())!=-1) { String value = vtdNav.toString(i); System.out.println("The value is - " + value); } } catch (Exception e) { e.printStackTrace(); } - person Abhaysinh Bhelke; 02.04.2018