Дайджест: извлечение имени узла - PullRequest
1 голос
/ 30 января 2010

Можно ли извлечь имя узла с помощью Apache Digester?

Итак, если xml выглядит как

   <furniture>
     <sofa>
       .....
     </sofa>
     <coffeeTable>
       .....
     </coffeeTable>
   </furniture>

можно ли извлечь имя узла "диван", "кофейная таблица"?

Я знаю, что это возможно с помощью xpath, но возможно ли это с помощью дайджестера?

Приветствия

Ответы [ 2 ]

1 голос
/ 30 января 2010

(оригинальный ответ)

Создайте Digester для шаблона "furniture/*" с простым Rule, который принимает второй параметр для каждого вызова метода begin и помещает его в коллекцию по вашему выбору (список, чтобы получить их все, установить, чтобы получить только все уникальные имена).

(редактировать)

Поцарапайте это, это немного сложнее.

Это работает:

public class App 
{
    final static Rule printRule = new Rule() {
        public void begin(String namespace, String name,
                Attributes attributes) throws Exception {
            System.out.println(name);
        }
    }; 
    public static void main( String[] args ) throws IOException, SAXException
    {
        InputStream instr = App.class.getResourceAsStream("/sample.xml");
        Digester dig = new Digester();
        dig.setRules(new RulesBase(){
            public List<Rule> match(String namespaceURI, String pattern) {
                return Arrays.asList(printRule);
            }
        });
        dig.parse(instr);
    }
}

В этом конкретном примере будут напечатаны все имена элементов, включая корневой элемент furniture. Я оставлю вам возможность настроить метод match() в соответствии с вашими потребностями.

0 голосов
/ 19 мая 2010

Это тот тип соответствия, который ExtendedBaseRules предоставляет.

Допустим, это содержимое furniture.xml:

<furniture>
   <sofa>
      <blah/>
   </sofa>
   <coffeeTable>
      <bleh/>
   </coffeeTable>
</furniture>

Допустим, вы хотите получить имена элементов прямых потомков элемента furniture. Это то, что furniture/? соответствует в ExtendedBaseRules.

import java.io.*;
import java.util.*;
import org.apache.commons.digester.*;

public class FurnitureDigest {
    public static void main(String[] args) throws Exception {
        File file = new File("furniture.xml");
        Digester digester = new Digester();
        digester.setRules(new ExtendedBaseRules());
        final List<String> furnitures = new ArrayList<String>();
        digester.addRule("furniture/?", new Rule() {
            @Override public void end(String nspace, String name) {
                furnitures.add(name);
            }
        });
        digester.parse(file);
        System.out.println(furnitures); // prints "[sofa, coffeeTable]"
    }
}

API ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...