2011-12-15 21 views
11

私は次のXMLファイルがありますので、それは印刷しjavaを使ってXMLファイルからプロパティを読み取る方法は?

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

F 

私はApacheを試してみましたどのように私は、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> 

をXPathExpressionEngineを使用してcommons-configurations XMLConfigurationを設定することはできますが、動作させることはできません。私はGoogleで検索し、いくつかの例を見つけましたが、どちらも:(私はすべての要素をループする必要はありません解決策を探しています を働くだろうしている。

よろしく、 アレックス

+0

が、あなたが個人としてあなたの特性を保存する特定の理由があります要素としてではなく属性としてではないか? '' –

+0

私はその形式を認識しません。それは何ですか? –

+0

エミール、これは最も自然な感じです。他の提案はありますか? – etxalpo

答えて

1

私がするのと同じXML文書と同様の構造を持つオブジェクトのセットにデータをバインドするためにJAXBを使用するよう

何か:

@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 

一つの可能​​な落とし穴は、リストのシリアライズに関してであり、二つのモードがあり、。ラップされアンラップされた;あなたのケースでは、あなたは "アンラップ"したい。注釈のJavadocsには、これを定義するアノテーションが表示されます。

+0

ええ、最初にXSDを作成し、beans.http://jaxb.java.net/tutorial/を生成してください。 –

+0

いいえ、絶対にそうではありません - XSDが必要だった場合、私はむしろ根管を持っています。代わりに、POJO(setterとgetters、またはpublicフィールドを持つ)を定義し、それを使用します。関係するスキーマはありません。 – StaxMan

1

多くの方法があります。 1つは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のライフサイクルに注意してください。

0

使用できるパーサーはいくつかあります。私にとってこれらのパーサーはうまく働いた:私はXStreamのをredommend

0

オブジェクト内のXMLを同じ構造体で解析します。

についてXStream

あなたのオブジェクトは次のようになります。

List<Resources> 

Resourcesはセッターとゲッターと、属性を持ちながら、id attibutes namevalueを持つオブジェクトPropertyです。

・ホープ、このヘルプ

0

私があなただったら、私はあなたの希望の方法(getPropertyResource、など)とのインターフェースを使用して、XPathの実装を提供することになります。

10

これは、プロパティファイルを標準の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> 

次に、このようなファイルからプロパティを読み込む:すべての答え/提案のため

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

感謝を!上に挙げたxmlライブラリのいくつかを試してみて、Simple XMLライブラリを使うことに決めました。私はすべての要素をループすることを避けるために、 "Dictionary"ユーティリティクラスが特に有用であることを発見しました。エレガントでシンプルです:)

以下は私の使い方です。

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

よろしく、

アレックス

(Windows Vistaの場合)実施例...それは他の誰かを助けることを願って

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

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

Property.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.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> 
ちょっとオフトピック
関連する問題