繁体   English   中英

如何使用java从xml文件中读取属性?

[英]How to read properties from xml file with java?

我有以下 xml 文件:

<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>

我怎样才能用 Java/Xml 做这样的事情:

Xml xml = new Xml("my.xml");
Resource res001 = xml.getResouceById("res003");
System.out.println("propF: " + res.getProperty("propF"));

所以它打印:

F

我已经尝试过使用 XPathExpressionEngine 的 apache commons-configurations XMLConfiguration,但我无法让它工作。 我用谷歌搜索并找到了一些例子,但都不起作用:(我正在寻找一个不需要遍历所有元素的解决方案。

问候,亚历克斯

这很简单,假设您愿意将属性文件重新编写为标准 Java 格式。 假设您在名为props.xml的文件中有以下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>

然后从文件中读取属性,如下所示:

java.util.Properties prop = new Properties();
prop.loadFromXML(new FileInputStream("props.xml"));
System.out.println(prop.getProperty("propF"));

我只是使用 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

一个可能的问题是关于列表序列化; 有两种模式,wrapped 和 unwrapped; 在你的情况下,你想要“解开”。 注释的 Javadocs 应该显示注释来定义它。

有很多方法。 一种是做JDOM和xpath。 像这样(来自这篇文章: http : //onjava.com/onjava/2005/01/12/xpath.html ):

SAXBuilder saxBuilder = 
    new SAXBuilder("org.apache.xerces.parsers.SAXParser");
org.jdom.Document jdomDocument =
    saxBuilder.build(new File("somefile");
org.jdom.Attribute levelNode = 
    (org.jdom.Attribute)(XPath.selectSingleNode(
        jdomDocument,
        "/resources/resource[@id='res003']/property[@name='propF']/@value"));
System.out.println(levelNode.getValue());

没有测试它,但应该工作。 有关 xpath 教程,请参阅http://zvon.org/xxl/XPathTutorial/General/examples.html 它是最好和最快的教程。

如果经常调用,请注意 saxbuilder 生命周期。

感谢所有的答案/建议! 我尝试了上面给出的一些 xml 库,并决定使用Simple XML 库。 我发现“字典”实用程序类特别有用,可以避免遍历所有元素。 优雅而简单:)

下面是我如何使用它。 我希望它可以帮助别人...

问候,

亚历克斯

一个工作示例(在 Windows Vista 上):

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

资源.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);
    }
}

资源.java

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

属性.java

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>

您可以使用多种解析器。 对我来说,这些解析器工作正常:

我重新推荐了 XStream。

它解析具有相同结构的对象中的 XML。

关于XStream

您的对象将是:

List<Resources>

Resources具有属性,带有 setter 和 getter, id是一个具有属性namevalue的对象Property

希望这有帮助

如果我是您,我会使用您想要的方法( getPropertyResource等)的接口并提供 XPath 实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM