2012-04-24 2 views
3

내 Android 앱은 Simple XML을 사용하여 거대한 XML 파일을 읽습니다. 분명히 그것은 시간이 좀 걸립니다. 사실, 지금은 요소 목록 하나만 검색하면됩니다. Simple XML이 다른 모든 요소를 ​​읽지 않도록하는 방법이 있습니까?Android - 단순 XML로 XML 파일의 일부 요소 가져 오기

다른 라이브러리를 사용하고 싶지 않습니다. 이런 종류의 고급 기능이 Simple XML에서 가능할 지 궁금합니다.

도움 주셔서 감사합니다. MH 제안을 사용


편집

는, 구문 분석은 여전히 ​​

그래서 내가 XmlPullParser를 사용하여 Ilya Blokh에서 다른 솔루션을 시도하고 싶습니다 ... 50 초 걸립니다.

다음

는 XML 파일의 필요한 부분이다 :

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    .... 
    <ANIMALS> 
     <animal> 
      <name>Dog</name> 
      <color>white</color> 
      <color>black</color> 
      <color>brown</color> 
     </animal> 
     <animal> 
      <name>Cat</name> 
      <color>white</color> 
      <color>black</color> 
      <color>gray</color> 
      <color>red</color> 
     </animal> 
     ... 
    </ANIMALS> 
    ... 
</ROOT> 

내가이 클래스 채울 싶습니다 : 나는 목록 및 XmlPullParser 다룰 수있는 방법을

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Animals { 

    /** 
    * Key: animal name, Value: animal colors 
    */ 
    private Map<String, List<String>> entries; 

    public Animals() { 
     entries = new HashMap<String, List<String>>(); 
    } 

    public void addAnimal(String name, List<String> colors) { 
     entries.put(name, colors); 
    } 

    public List<String> getColors(String animalName) { 
     return entries.get(animalName); 
    } 
} 

를? 나는 다시

답변

3

당신은 전체 문서 구조를 지정의 엄격한 요구 사항을 해결하기 위해 loose mapping flag를 사용할 수 있습니다. 이 기능은 단일 요소 목록에만 관심이 있기 때문에 Persister에서 직접 사용하면 편리합니다. 링크 된 예를보고 살펴보십시오.

불행히도 나는 단순한 XML의 내부 구조에 익숙하지 않아 에 대해 아무 말도하지 않고 "다른 모든 요소를 ​​읽지 않습니다."입니다. 위에 설명 된 느슨한 매핑 옵션을 사용하면 관심있는 매핑 만 발생하지만 전체 XML 문서를 구문 분석하지 않아도되는지 의심 스럽습니다.

+0

Thansk, 이것은 내가 찾고있는 거의 것입니다. – Maxbester

0

첫째 ... 파서 작업에

감사를 사용하고 있지 않다 당신은 당신이 처음에 SimpleXML을를 사용해야하는 이유 응용 프로그램 요구 사항을 고려하여 정당화 할 필요가있다. 왜 자바 기반의 XML 파싱을 사용하지 않는가? 다음은 사용할 수있는 옵션 목록입니다. Best XML parser for Java

+0

방금 ​​위에서 언급 한 것처럼이 XML의 구조는 매우 복잡하고 앞으로 발전 할 수 있습니다. 나는 쉽고 빠르며 적응력있는 솔루션을 원했습니다. 어쨌든 고마워! – Maxbester

0

XmlPullParser을 쉽게 알면 마음이 바뀔 것입니다.

당신은 여기에 대해 읽을 수 있습니다 : http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

예 사용 XmlPullParser의를 :

XmlPullParser parser = getResources().getXml(R.xml.yourxml); 
try { 
      while (parser.getEventType() != XmlPullParser.END_DOCUMENT){ 
       if(parser.getEventType() == XmlPullParser.START_TAG && 
         parser.getName().equalsIgnoreCase("object")){ 

          name = parser.getAttributeValue(null, "name"); 
          site = parser.getAttributeValue(null, "site"); 
          phone = parser.getAttributeValue(null, "phone"); 
          adds = parser.getAttributeValue(null, "address"); 
       } 
       parser.next(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } 
+0

문제는이 XML의 구조가 매우 복잡하고 앞으로 발전 할 수 있다는 것입니다. 나는 쉽고 빠르며 적응력있는 솔루션을 원했습니다. 어쨌든 고마워! – Maxbester

0

simplexml을 사용하십시오. xml이 복잡 해지면 안드로이드와 함께 사용하는 것이 가장 좋은 것은 간단한 xml입니다. 그래서 귀하의 경우 코드는 이렇게 될 것입니다, 나는 그것을 충분히 포맷 할 수는 없지만 도움이 될 것입니다. 단점 : (XML 구조에 따라) 많은 클래스를 만들어야하지만, 일단 생성하면 클래스는 나중에 매끄럽게 진행됩니다. 또한 클래스에 getter를 추가하여 값을 평가하십시오.희망이 도움이

import java.util.ArrayList; 
import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Element; 
import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.Namespace; 
import org.simpleframework.xml.Root; 

@Root(name = "ANIMALS", strict = false) 
@Namespace(reference = "whatever", prefix = "sumthing") 
public class Animal { 
@ElementList(required = false, inline = true)// this will work even if some other 
// element gets added to your ANIMALS element. 
private ArrayList<Animal> somename; // does not matter 
} 

@Root(name = "animal", strict = false) 
@Namespace(reference = "whatever", prefix = "sumthing") 
public class Animal { 
@Element(required = false)// to make it work even when this element is not part of 
    the string 
private String name; 
@ElementList(required = false, inline = true) 
private ArrayList<Color> colors; 
} 

@Element(name = "color") 
@Namespace(reference = "whatever", prefix = "sumthing") 
public class Color { 
@Element(required = false) 
private String clr; 
public String getColor(){ 
return clr; 
} 
} 
+0

마지막으로 훨씬 빠르기 때문에 XmlPullParser를 사용했습니다. 에뮬레이터에서 Simple XML은 50 초, XmlPullParser는 6 초 밖에 걸리지 않았습니다! 그건 그렇고, 당신의 예에서는, 당신은 컬러 클래스를 만들 의무가 없습니다. 동물 클래스에서는 다음을 작성하십시오. @ElementList (필수 = false, 인라인 = true, 항목 = "색상") ArrayList colors; – Maxbester

+0

단순 XML은 주석에서 스키마를 동적으로 빌드해야하기 때문에 처음으로 느려질 것입니다. 그러나 다음 번에는 더 빨라질 것입니다. –