Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Digester和XSLT转换从xml中获取特定值以过滤掉_Java_Apache Commons Digester - Fatal编程技术网

Java 使用Digester和XSLT转换从xml中获取特定值以过滤掉

Java 使用Digester和XSLT转换从xml中获取特定值以过滤掉,java,apache-commons-digester,Java,Apache Commons Digester,我正在使用apache.commons.digester处理一个xml文件 例如,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"

我正在使用apache.commons.digester处理一个xml文件

例如,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 >





我希望避免在消化器解析xml后循环。是否有任何规则可以指定,以便我只返回与
name=“XYZ.EXE”

更新- 因为,我问了这个问题,我在谷歌上搜索并发现,它说,仅使用Digester,无法访问具有特定值的属性。需要使用XSLT转换(org.xml.sax.XMLFilter)。我不知道该怎么做。仍在寻找解决方案。欢迎任何建议

digester.addRule("Files/File",new ConditionalCreationRule("XYZ.EXE"));
在条件创建规则(您创建的类)中,您可以这样做。请告诉我这是否足够。

完整片段

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);
    }
}
公共类文件{
列表=新的ArrayList();
公共文件(){
超级();
}
公共布尔添加文件(MyFile f){
返回列表。添加(f);
}
}
公共类MyFile{
公共字符串名称;
公共字符串版本;
公共字符串大小;
公共void集合名(字符串名){
this.name=名称;
}
公共void setVersion(字符串版本){
this.version=版本;
}
公共void setSize(字符串大小){
这个。大小=大小;
}
@凌驾
公共字符串toString(){
返回“MyFile[name=“+name+”,size=“+size+”,version=”
+版本+“]”;
}
}
类ConditionalRule扩展了ObjectCreateRule{
私有布尔条件=false;
public ConditionalRule()引发ParserConfiguration异常{
super(MyFile.class);
}
@凌驾
public void begin(字符串名称空间URI、字符串名称、属性)
抛出异常{
conditional=“ABC.EXE”。等于(attributes.getValue(“Name”);
如果(有条件){
Files Files=(Files)digester.pop();
MyFile f=新的MyFile();
addFile(f);
推送(文件);
消化器。推(f);
}
}
@凌驾
public void end()引发异常{
如果(有条件){
digester.pop();
}
}
}
公共类代码段{
@试验
public void test()引发异常{
蒸煮器d=新蒸煮器();
d、 addObjectCreate(“文件”,Files.class);
d、 addRule(“文件/文件”,新条件规则());
d、 addSetProperties(“文件/文件”,
新字符串[]{“名称”、“版本”、“大小”},新字符串[]{“名称”、“版本”、“大小”});
objectparse=d.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(“digest.xml”);
System.out.println(解析);
}
}

OMG!我真是太感谢你了。我在查看NodeCreateRule.java,想知道应该覆盖哪些函数。这对我来说是一个陌生的领域。谢谢!平静风暴。完美的解决方案。