Получение определенного значения из XML с использованием Digester и XSLT-преобразования для фильтрации - PullRequest
0 голосов
/ 04 марта 2010

Я обрабатываю XML-файл, используя apache.commons.digester

XML, например, имеет следующую структуру:

< Files >    
< File Name="ABC.EXE" Version="1.0" Size="3954174" >    
< File Name="XYZ.EXE" Version="2.0" Size="11833856" >    
< File Name="RST.exe" Version="3.0" Size="32768" >    
< Files >

Я хочу избежатьцикл после того, как Digester анализирует XML.Есть ли какое-либо правило, которое я могу указать, чтобы я возвращал только атрибуты, связанные с файлом с name="XYZ.EXE'

Обновление -

Поскольку, я задал этот вопрос, я погуглил и наткнулся, http://wiki.apache.org/commons/Digester/FAQ, где говорится, что используя только Дигестера, нельзя получить доступ к атрибутам с конкретными значениями.Нужно использовать XSLT-преобразование (org.xml.sax.XMLFilter).Я понятия не имею, как это сделать.Все еще в поисках решения.Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Полный фрагмент

public class Files {
    List<MyFile> list = new ArrayList<MyFile>();

    public Files() {
        super();
    }

    public boolean addFile(MyFile f) {
        return list.add(f);
    }
}

public class MyFile {
    public String name;
    public String version;
    public String size;
    public void setName(String name) {
        this.name = name;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    public void setSize(String size) {
        this.size = size;
    }
    @Override
    public String toString() {
        return "MyFile [name=" + name + ", size=" + size + ", version="
                + version + "]";
    }

}

class ConditionalRule extends ObjectCreateRule {

    private boolean conditional = false;
    public ConditionalRule() throws ParserConfigurationException {
        super(MyFile.class);
    }

    @Override
    public void begin(String namespaceURI, String name, Attributes attributes)
            throws Exception {
        conditional = "ABC.EXE".equals(attributes.getValue("Name"));
        if(conditional) {
            Files files = (Files) digester.pop();
            MyFile f = new MyFile();
            files.addFile(f);
            digester.push(files);
            digester.push(f);
        }
    }

    @Override
    public void end() throws Exception {
        if(conditional) {
            digester.pop();
        }
    }

}
public class Snippet {

    @Test
    public void test() throws Exception {
        Digester d = new Digester();
        d.addObjectCreate("Files", Files.class);
        d.addRule("Files/File", new ConditionalRule());
        d.addSetProperties("Files/File",
                new String[]{"Name", "Version", "Size"}, new String[]{"name", "version", "size"});
        Object parse = d.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("digest.xml"));
        System.out.println(parse);
    }
}
1 голос
/ 04 марта 2010
digester.addRule("Files/File",new ConditionalCreationRule("XYZ.EXE"));

В условном правиле создания (создаваемый вами класс) вы можете сделать это. Дайте мне знать, если этого достаточно.

...