XML 관련 | mucchin의 Android 전기



Android 애플 리케이션 XML의 읽기 방법


Android 애플 리케이션에서 XML을로드 분석하는 방법은?

Android 애플 리케이션에서 XML 파일을 분석하고 뭔가를한다는 애플 리케이션을 생각하고있는 분들도 많다고 생각합니다.
예를 들어, Web 서비스 API를 이용하고 싶다는 것이면, XML 분석은 필수 기술입니다.
(Web Services API는 라쿠텐, 아마존, 채용 등등, 여러 업체가 제공 해주고있는 것이지만, 여기서는 설명하지 않겠습니다.)
는 Android에서 XML 읽기, 분석을 위해 내가하고있는 단계를 소개합니다.


우선 다음 두 가지 클래스를 가져올시켜 둡니다.
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;


Web Services API를 사용할 때 경우 HTTP 통신에서 XML 파일을 읽어 InputStream 인스턴스를 취득한다는 방법을 취한다고 생각 합니다만, 이번 설명에서는 이미 XML 파일을 InputStream 인스턴스에로드하는 라는 전제로 이야기를 진행합니다.
1 다음과 같이 XmlPullParser 인스턴스를 가져옵니다.


XmlPullParser xmlPullParser = Xml.newPullParser ();


XmlPullParser은 XML 요소를 차례로 읽어 나가기위한 기능을 제공하는 클래스라고 생각합니다.
2. 다음과 같이 XmlPullParser에 XML 파일이로드되는 InputStream을 설정합니다.


xmlPullParser.setInput (is "UTF-8");


※ 첫 번째 인수의 is는 InputStream 인스턴스 제 2 인수는 XML 파일의 인코딩을 지정하십시오.


이것으로 XML을 분석하고 갈 준비가되었습니다.
나머지는 원하는 것에 따라, 로딩 갑니 다만, 여기에서는 다음과 같은 잠재적으로로드 간다,라고하는 것을합니다.
· XML 파일의 처음부터 마지막​​까지, name 태그 값 (Value)의 목록을 가져옵니다.
"name 태그 값"은 다음 xxx 부분입니다.
<name> xxx </ name>
먼저 예제 코드를 보여줍니다.




String a [] = new String [] ();
int counter = 0;
for (int e = xmlPullParser.getEventType (); e! = XmlPullParser.END_DOCUMENT; e = xmlPullParser.next ()) {
if (e == XmlPullParser.START_TAG && xmlPullParser.getName () equals ( "name")) {
a [counter] = xmlPullParser.nextText ();
counter + +
}
}


최소한의 코드만 작성하지 않지만, 이런 느낌입니다.
xmlPullParser는 XML을 각 행하거나 1 원소 라든지 아니라, 정말로 하나씩 정성스럽게 읽고갑니다.
시작 태그, 값 닫는 태그가 있으면 XmlPullParser.next ()을 사용하면 시작 태그 ⇒ 값을 ⇒ 종료 태그 나가는 구조입니다.
이것은 편리 하나 불편하거나 어느 지요.
내가 처음 당황했습니다.
for 루프를 보면, xmlPullParser.getEventType ()을 기본값으로하고 있습니다.
이 시점에서 xmlPullParser은 InputStream을 설정뿐이므로 getEventType ()의 값은 시작을 의미한다 "START_DOCUMENT"가 있습니다.
루프의 종료 조건은 마지막을 의미하는 "END_DOCUMENT"될 때까지합니다.
루프 때마다 XmlPullParser.next ()를 실행하고 다음 다음으로 나간다.
는 루프입니다.
이것은 XML 파일의 처음부터 끝까지 읽어가는,이라고 할 수 있습니다.
다음은 루프 내부의 설명입니다.
if 문의 조건에 대해 설명합니다.
간단히 말해, "name 태그의 시작 태그인 경우"라는 뜻입니다.
원하는 것은 name의 시작 태그와 종료 태그로 둘러싸인 "값"입니다만, 그 "값"자신이 xmlPullParser의 현재되어있는 상태에서는, 값은 잡힙니 다만, 원래 그것이 무엇 태그 로 묶여 있었는지이 잡히지 않는 것입니다. (getName ()의 반환값이 null가된다.)
그래서, name 태그의 시작 태그가 현재되어있을 때 다음 요소의 문자열을 가지고 간다, 그래서, if 문장 속에서 nextText ()를 사용합니다.
이것은 다음의 요소를 String 형식으로 검색한다는 방식입니다.


이외에도 방법은 있으므로, 반드시 상기가 좋은 예가인지는 모릅니다.
나는 대략 위와 같이하고 있습니다.
덧붙여서, 값 대신하여 태그 속성을 가지고가는 방법도 김에이므로 소개해두고 있습니다.
예를 들어, 위와 같은 느낌으로, 이번에는 name 태그의 id 속성 목록을 가지고 간다,라고하는 것이합시다.
"name 태그의 id 속성"은 다음 yyy 부분입니다.
<name id=yyy> xxx </ name>


for 루프, if 문은 동일하기 때문에 if 문장의 내용만 발췌합니다.
다음과 같이합니다.


a [counter] = xmlPullParser.getAttributeValue (null, "name");


속성 취득의 경우는 위와 같이 getAttributeValue ()를 사용합니다.
첫 번째 파라미터는 null, 제 2 인수에 속성​​ 이름이다 "name"을 지정합니다.
API 문서에 의하면, 첫 번째 파라미터는 "네임 스페이스", 제 2 인수는 "속성 이름"이라고되어​​ 있습니다.
네임 스페이스가 불활성면, 첫 번째 파라미터는 null이 아니면 안된다,라고 쓰고 있기 때문에, 이번에는 null하고 있습니다.
"XML 네임 스페이스 '에 대해 나는 내용이 아니기 때문에 여기서는 설명하지 않습니다.
아니, 수 없습니다. (쓴웃음)
getAttributeValue ()는 또 다른 방법으로 int 형 인수를 하나 가지는 패턴도 준비되어 있습니다.
이것은 인덱스를 지정하는 것 같습니다 그래서 만약 이번 사건을 대체한다면, 첫 번째 특성이므로


a [counter] = xmlPullParser.getAttributeValue (0);


입니다.
배열 인덱스와 마찬가지로 실제 번호에서 1을 뺀 값을 지정합니다.

위에서 소개한 방법만으로도 사용할 수 있으면, Web 서비스 API에서 가져온 XML의 해석되지 수 있습니다.