gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:34:21 25 4
gpt4 key购买 nike

我正在使用 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 >

我想避免在 Digester 解析 xml 后循环。我是否可以指定任何规则,以便仅返回与 name="XYZ.EXE'

文件相关的属性

更新 -

自从我问这个问题以来,我用谷歌搜索并发现,http://wiki.apache.org/commons/Digester/FAQ其中说单独使用 Digester,无法访问具有特定值的属性。需要使用 XSLT 转换(org.xml.sax.XMLFilter)。我不知道该怎么做。仍在寻找解决方案。欢迎任何建议。

最佳答案

完整片段

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);
}
}

关于java - 使用 Digester 和 XSLT 转换从 xml 获取特定值以过滤掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com