如何使用java从xml文件读取属性?
我有以下xml文件:如何使用java从xml文件读取属性?,java,xml-parsing,Java,Xml Parsing,我有以下xml文件: <resources> <resource id="res001"> <property name="propA" value="A" /> <property name="propB" value="B" /> </resource> <resource id="res002"> <property name="propC"
<resources>
<resource id="res001">
<property name="propA" value="A" />
<property name="propB" value="B" />
</resource>
<resource id="res002">
<property name="propC" value="C" />
<property name="propD" value="D" />
</resource>
<resource id="res003">
<property name="propE" value="E" />
<property name="propF" value="F" />
</resource>
</resources>
所以它打印:
F
我已经尝试了ApacheCommons配置XMLConfiguration和XPathExpressionEngine,但我就是不能让它工作。我在谷歌上搜索并找到了一些例子,但两者都不起作用:(
我正在寻找一种解决方案,不需要遍历所有元素
问候,,
Alex我只想使用JAXB将数据绑定到一组对象中,这些对象的结构与XML文档类似 比如:
@XmlRootElement("resources")
public class Resources {
public List<Resource> resource = new ArrayList<Resource>(); // important, can't be left null
}
public class Resource {
@XmlAttribute public String id;
public List<Property> property;
}
// and so on
@XmlRootElement(“资源”)
公共类资源{
public List resource=new ArrayList();//重要,不能为空
}
公共类资源{
@XmlAttribute公共字符串id;
公共财产清单;
}
//等等
一个可能的问题是关于列表序列化;有两种模式,包装和取消包装;在您的情况下,您需要“取消包装”。注释的Javadocs应该显示注释来定义这一点。有很多方法。一种是执行JDOM和xpath。类似于以下内容(本文:): 没有测试它,但应该可以工作。有关xpath教程,请参阅。这是最好、最快的教程
如果经常调用saxbuilder生命周期,请注意它。有几种解析器可以使用。对我来说,这些解析器工作得很好:
List<Resources>
列表
虽然资源
具有属性,带有setter和getter,id
是一个对象属性
,带有attibutes名称
和值
希望这些帮助如果我是你,我会使用一个带有你想要的方法的接口(
getProperty
,Resource
,等等)并提供一个XPath实现。假设您愿意将属性文件重新写入标准Java格式,那么这很简单。假设您在名为props.xml的文件中有以下内容:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>This is a comment</comment>
<entry key="propA">A</entry>
<entry key="propB">B</entry>
<entry key="propC">C</entry>
<entry key="propD">D</entry>
<entry key="propE">E</entry>
<entry key="propF">F</entry>
</properties>
感谢所有的答案/建议!我尝试了上面给出的一些xml库,并决定使用xml库。我发现“Dictionary”实用程序类特别有用,可以避免在所有元素之间循环。优雅而简单:)
下面是我如何使用它。我希望它能帮助其他人
问候,
亚历克斯
一个工作示例(在Windows Vista上):
控制台窗口:
A-001
B-001
Resources.java
package demo;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.util.Dictionary;
@Root(name="resources")
public class Resources {
@ElementList(entry = "resource", inline = true)
private Dictionary<Resource> resources = new Dictionary<Resource>();
public Resources(@ElementList(entry = "resource", inline = true) Dictionary<Resource> resources) {
this.resources = resources;
}
public Resource getResourceByName(String name){
return resources.get(name);
}
}
resources.xml
<resources>
<resource name="res001">
<property name="propA" value="A-001" />
<property name="propB" value="B-001" />
</resource>
<resource name="res002">
<property name="propA" value="A-002" />
<property name="propB" value="B-002" />
</resource>
<resource name="res003">
<property name="propA" value="A-003" />
<property name="propB" value="B-003" />
</resource>
</resources>
有点离题,但您是否有特殊原因将属性存储为单个元素而不是属性<代码>
我不认识那种格式。这是什么?埃米尔,这样感觉很自然。还有其他建议吗?是的,但是先创建一个XSD,然后生成bean。不,绝对没有——如果需要XSD,我宁愿使用根管。相反,您只需定义POJO(使用setter和getter;或公共字段),并使用它。没有涉及任何模式。
package demo;
import java.io.File;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
public class Demo {
public static void main(String[] args) throws Exception {
File file = new File("c:\\temp\\resources.xml");
Serializer serializer = new Persister();
Resources resources = serializer.read(Resources.class, file);
Resource resource = resources.getResourceByName("res001");
System.out.println(resource.getProperty("propA"));
System.out.println(resource.getProperty("propB"));
}
}
A-001
B-001
package demo;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.util.Dictionary;
@Root(name="resources")
public class Resources {
@ElementList(entry = "resource", inline = true)
private Dictionary<Resource> resources = new Dictionary<Resource>();
public Resources(@ElementList(entry = "resource", inline = true) Dictionary<Resource> resources) {
this.resources = resources;
}
public Resource getResourceByName(String name){
return resources.get(name);
}
}
package demo;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.util.Dictionary;
import org.simpleframework.xml.util.Entry;
public class Resource implements Entry{
@Attribute(name = "name") private final String name;
@ElementList(inline=true, name="property") private Dictionary<Property> properties;
public Resource(
@Attribute(name = "name") String name,
@ElementList(inline=true, name="property") Dictionary<Property> properties) {
this.name = name;
this.properties = properties;
}
public String getName() {
return name;
}
public String getProperty(String name) {
return properties.get(name).getValue();
}
}
package demo;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.util.Entry;
@Root
public class Property implements Entry{
@Attribute(name="name") private String name;
@Attribute(name="value") private String value;
public Property(@Attribute(name="name") String name, @Attribute(name="value") String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}
<resources>
<resource name="res001">
<property name="propA" value="A-001" />
<property name="propB" value="B-001" />
</resource>
<resource name="res002">
<property name="propA" value="A-002" />
<property name="propB" value="B-002" />
</resource>
<resource name="res003">
<property name="propA" value="A-003" />
<property name="propB" value="B-003" />
</resource>
</resources>