How to read properties from xml file with java?

后端 未结 7 1323
独厮守ぢ
独厮守ぢ 2021-01-08 00:51

I have the following xml file:


    
        
        

        
相关标签:
7条回答
  • 2021-01-08 01:30

    Thanks for all the answers/suggestions! I tried some of the xml libraries given above and decided to go with the Simple XML library. I found the "Dictionary" utility class especially useful, to avoid looping through all the elements. Elegant and simple :)

    Below is how I used it. I hope it can help someone else...

    Regards,

    Alex

    A working example (on 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"));
        }
    }
    

    Console window:

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

    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>
    
    0 讨论(0)
  • 2021-01-08 01:37

    I would just use JAXB to bind data into set of objects that have structure similar to your XML document.

    Something like:

    @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
    

    one possible gotcha is regarding List serialization; there are two modes, wrapped and unwrapped; in your case, you want "unwrapped". Javadocs for annotations should show annotation to define this.

    0 讨论(0)
  • 2021-01-08 01:38

    This is trivial, assuming you're willing to re-write your properties file into the standard Java format. Assume you have the following in a file called 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>
    

    Then read properties from the file like this:

    java.util.Properties prop = new Properties();
    prop.loadFromXML(new FileInputStream("props.xml"));
    System.out.println(prop.getProperty("propF"));
    
    0 讨论(0)
  • 2021-01-08 01:38

    If I were you, I would use an interface with your desired methods (getProperty, Resource, etc) and provide an XPath implementation.

    0 讨论(0)
  • 2021-01-08 01:41

    There are several parsers you can use. For me these parsers worked fine:

    • Soup
    • SimpleXMLParser
    0 讨论(0)
  • 2021-01-08 01:42

    I redommend the XStream.

    It parse the XML in the object with same strutuct.

    About XStream

    The your object will be:

    List<Resources>
    

    while Resourceshave the attributes, with setters and getters, id that is an object Property with attibutes name and value.

    Hope this help

    0 讨论(0)
提交回复
热议问题