2011-12-15 4 views
11

나는 다음과 같은 XML 파일이 있습니다java로 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과 같은 것을 할 수있는 방법 XPathExpressionEngine을 사용하여 commons-configurations XMLConfiguration을 구성 할 수 있지만 작동시키지 못합니다. 내가 봤 발견 몇 가지 예를하지만, 둘 다 내가 모든 요소를 ​​통해 루프를 필요로하지 않는 솔루션을 찾고 있어요 을 :(일하는 것이있다.

안부, 알렉스

+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 

하나 개의 가능한 잡았다 목록 직렬화에 관한되며, 두 가지 모드가있다, 감싸 인 및 풀지 않은; 귀하의 경우, 당신은 "unwrapped"를 원합니다. 주석을위한 Javadocs는 이것을 정의하는 주석을 표시해야합니다.

+0

그래,하지만 먼저 XSD를 만들고 beans.http를 생성해라. //jaxb.java.net/tutorial/ –

+0

아니다. XSD가 필요하다면 근본적으로 근관을 갖고 싶을 것이다. 대신 POJO (setter 및 getters 또는 public 필드 포함)를 정의하고이를 사용합니다. 스키마가 없습니다. – StaxMan

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

.

같은 strutuct를 사용하여 개체의 XML을 구문 분석합니다.

는 약 XStream

당신의 목적은 다음과 같습니다

List<Resources> 

Resources 동안은 세터와 게터와, attibutes namevalue와 객체 Property입니다 id를 속성이 있습니다.

희망이 도움

0

내가 당신이라면,이 (등 getProperty, Resource) 원하는 방법과 인터페이스를 사용하는 것과는 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

,363,210
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> 
약간 주제 오프
관련 문제