2011-12-15 5 views
11

मैं निम्नलिखित xml फ़ाइल है:जावा के साथ xml फ़ाइल से गुणों को कैसे पढ़ा जाए?

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

तो यह प्रिंट:

F 

मैं अपाचे की कोशिश की है

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

मैं जावा/XML के साथ कुछ इस तरह कर सकते हैं कैसे कॉमन्स-कॉन्फ़िगरेशन XML कॉन्फ़िगरेशन XPathExpressionEngine के साथ, लेकिन मैं इसे काम नहीं कर सकता। मैं googled है और पाया कुछ उदाहरण, लेकिन न तो :(काम करेगा मैं एक समाधान है, जहां मैं सभी तत्वों के माध्यम से लूप की जरूरत नहीं है के लिए देख रहा हूँ।

सादर, एलेक्स

+0

, लेकिन कोई विशेष कारण है कि आप व्यक्ति के रूप में अपनी संपत्ति की दुकान है तत्वों और गुणों के रूप में नहीं? '<संसाधन आईडी =" res003 "propE =" ई "propf =" एफ "/>' –

+0

मैं उस प्रारूप को पहचान नहीं पा रहा हूं। यह क्या है? –

+0

एमिल, यह इस तरह से सबसे प्राकृतिक लगता है। कोई अन्य सुझाव? – etxalpo

उत्तर

1

मैं सिर्फ होगा 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 

एक संभव पकड़ लिया सूची क्रमांकन के बारे में है, वहाँ दो तरीके हैं, लपेटा और unwrapped; आपके मामले में, आप "अनचाहे" चाहते हैं। एनोटेशन के लिए जावाडॉक्स को इसे परिभाषित करने के लिए एनोटेशन दिखाना चाहिए।

+0

हाँ, लेकिन फिर पहले एक एक्सएसडी बनाएं, और beans.http: //jaxb.java.net/tutorial/ –

+0

नहीं, बिल्कुल नहीं - यदि एक्सएसडी की आवश्यकता है, तो मुझे रूट नहर चाहिए। इसके बजाय, आप केवल पीओजेओ (सेटर्स और गेटर्स या सार्वजनिक फ़ील्ड के साथ) को परिभाषित करते हैं, और इसका उपयोग करते हैं। कोई योजना शामिल नहीं है। – StaxMan

1

कई तरीके हैं। एक जेडीओएम और एक्सपैथ करना है। कुछ इस तरह (इस लेख से: 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 देखें। यह सबसे अच्छा और सबसे तेज़ ट्यूटोरियल है।

सैक्सबिल्डर जीवन चक्र के बारे में परवाह करें, अगर इसे अक्सर कहा जाता है।

0

ऐसे कई पार्सर्स हैं जिनका आप उपयोग कर सकते हैं। मेरे लिए इन पारसर्स ठीक काम किया:

0

मैं Xstream redommend।

यह ऑब्जेक्ट में एक्सएमएल को उसी स्ट्रूटक्ट के साथ पार्स करता है।

बारे XStream

अपने वस्तु हो जाएगा:

List<Resources> 

जबकि Resources, setters और getters साथ, गुण id attibutes name और value के साथ एक वस्तु Property है।

आशा इस मदद

0

अगर मैं तुम्हें थे, मैं अपने वांछित तरीके (getProperty, Resource, आदि) के साथ एक अंतरफलक का प्रयोग करेंगे और एक XPath कार्यान्वयन प्रदान करते हैं।

10

यह छोटा है, मानते हुए कि आप अपनी गुण फ़ाइल को मानक जावा प्रारूप में फिर से लिखना चाहते हैं। मान लें आप 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

सभी उत्तर/सुझाव के लिए धन्यवाद! मैंने ऊपर दिए गए कुछ एक्सएमएल पुस्तकालयों की कोशिश की और Simple एक्सएमएल लाइब्रेरी के साथ जाने का फैसला किया। मुझे सभी तत्वों के माध्यम से लूपिंग से बचने के लिए "शब्दकोश" उपयोगिता वर्ग विशेष रूप से उपयोगी पाया गया। सुरुचिपूर्ण और सरल :)

नीचे मैं इसका उपयोग कैसे करता हूं। मुझे आशा है कि यह किसी और में मदद कर सकते हैं ...

सादर,

एलेक्स

एक काम कर उदाहरण (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 

संसाधन.जावा

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> 
थोड़ा विषय बंद
संबंधित मुद्दे