반응형
반응형

오늘은 코틀린(Kotlin)에서 XML을 사용하는 방법에 대해서 알아보겠습니다.

XML은 다양한 포맷을 지원하기 때문에 JSON 비해 느린 단점이 있지만 

일반적으로 사용하기 매우 편리한 저장 포맷입니다.

android에서는 외부 파일을 확인하기 위해서 일반적인 접근이 불가능합니다.

그래서 미리 만들어둔 XML 파일을 APK에 포함시켜 사용할 수 있는 방법을 적용해야 XML을 쉽게 접근할 수 있습니다.

android에서는 APK에 XML 파일을 포함할 수 있는 에셋(asset) 폴더를 생성해서 접근이 가능합니다.

안드로이드(android) 프로젝트를 생성하면 assets 폴더는 포함되어 있지 않습니다.

폴더 추가를 사용해서 assets 폴더를 생성하고 info.xml을 생성합니다.

<?xml version="1.0" encoding="utf-8"?>
<book>
   <bookinfo id="1111" name="책1번"  des="책1번은 요리책입니다." />
   <bookinfo id="1112" name="책2번"  des="책2번은 요리책입니다." />
   <bookinfo id="1113" name="책3번"  des="책3번은 요리책입니다." />
   <bookinfo id="1114" name="책4번"  des="책4번은 요리책입니다." />
</book>

간단하게 XML을 로드하기 위해서 4개의 로드를 생성합니다.

정상적으로 XML이 만들어지면 브라우저에서 트리 구조 파일을 확인할 수 있습니다.

코틀린(kotlin)에서 XML을 사용하기 위해서는 org.xmlpull.v1.XmlPullParser,

org.xmlpull.v1.XmlPullParserFactory 패키지를 포함해야 합니다.

먼저 InputStream을 사용해서 생성한 폴더 assets에 접근해서 XML 파일을 open 합니다.

XmlPullParserFactory를 사용해서 신규 인터페이스를 생성합니다.

XmlPullParser를 생성해서 factory와 연결 후 xml파일을 로드합니다.

var xmlinfo:InputStream = assets.open("info.xml")

var factory:XmlPullParserFactory = XmlPullParserFactory.newInstance()

var parser:XmlPullParser = factory.newPullParser()

parser.setInput( xmlinfo, null)

전체 XML 파일을 확인하기 위해서 타입을 확인하고 END_DOCUMENT까지 로드를 반복합니다.

설정한 tag는 "bookinfo"이므로 if 문에서 "bookinfo"일 경우만 getAttributeValue를 사용해서 하위 로드에 접근합니다.

getAttributeValue는 배열 형태로 Value 정보를 확인할 수 있습니다.

while( event != XmlPullParser.END_DOCUMENT){

                var tag_name = parser.name

                when(event){
                    XmlPullParser.END_TAG ->{
                        if( tag_name == "bookinfo")
                        {
                            var item:String = parser.getAttributeValue(0) + parser.getAttributeValue(1) + parser.getAttributeValue(2)
                            Toast.makeText(this, item, Toast.LENGTH_SHORT).show()
                            AddTextView(item)
                        }
                    }
                }
                event = parser.next()
            }

parser.next()를 사용해서 다음 로드로 이동하면 됩니다.

코틀린(kotlin)을 사용하면 XML을 쉽게 관리할 수 있어 매우 편리합니다.

다양한 외부 정보를 관리하기 위해서는 XML은 꼭 필요한 포맷이기 때문에 공부하시면 좋습니다.

컴파일하면 XML 로드와 동일하게 리스트를 생성합니다.

XML과 JSON을 많이 비교합니다.

JSON은 상대적으로 XML보다 빠르기 때문에 서버 데이터 전송에 많이 사용됩니다.

XML 장점은 UTF-8만 지원하는 JSON과 다르게 다양한 인코딩 형식을 지원하기 때문에 범용적으로 사용하기 좋습니다.

읽기/쓰기 속도에 큰 문제가 없는 프로그램이라면 XML 사용을 적극 추천드립니다.

감사합니다.

 

 

반응형
반응형

안녕하세요. 오늘은 C# XmlSerializer 사용법에 대해서 알아보겠습니다.

XmlSeralizer Class는 xml 정보를 Deserialize하여 지정된 Class에 정보를 복사하는 Class입니다.



XmlSerializer Class MSDN입니다.


XmlSerializer 생성자 입니다.




메서드입니다.




이벤트입니다.




XmlSerializer을 사용하기 위해서는 먼저 Xml생성해야 합니다.

Serializable되어야 하므로 사용 Class와 동일한 구조로 작성해 줍니다.

 

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
  <Item>
    <Item1>Item1 A</Item1>
    <Item2>Item1 B</Item2>
    <Item3>Item1 C</Item3>
    <Page>1</Page>
  </Item>
</Config>
cs

xml에 보이는 Config가 기본 Class 이름입니다.

하위 로드는 Item, Item1, Item2, Item3, Page입니다.

Class구성시 같은 구조로 되어 있어야 정상 동작합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Serializable]
public class Config : XmlPersistableObject
{
      public Config() { Item = new ItemObject(); }
      public ItemObject Item;
}
 
public class ItemObject
{
      public string Item1 { get; set; }
      public string Item2 { get; set; }
      public string Item3 { get; set; }
      public int Page { get; set; }
}
cs

XmlPeristableObject Class를 상속 받아서 Xml 직접 제어하는 Class입니다.

Xml과 동일한 구조입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class XmlPersistableObject
{
      public static T Load<T>(string szFileName) where T : XmlPersistableObject, new()
      {
          T result = default(T);
          using (FileStream stream = File.OpenRead(szFileName))
          {
              result = new XmlSerializer(typeof(T)).Deserialize(stream) as T;
          }
          return result;
      }
 
      public void Save<T>(string szFileName) where T : XmlPersistableObject
      {
          using (FileStream stream = new FileStream(szFileName, FileMode.CreateNew))
          {
              new XmlSerializer(typeof(T)).Serialize(stream, this);
          }
      }
}
cs


XmlSerializer 사용 Class입니다.

T를 사용해서 작성한 Class를 Deserialize하거나 Serialize합니다.


1
2
3
4
5
6
7
8
string szXmlPath = Application.StartupPath + "\\configXml.xml";
Config cnf = new Config();
cnf.Item.Item1 = "Item1 A";
cnf.Item.Item2 = "Item1 B";
cnf.Item.Item3 = "Item1 C";
cnf.Item.Page = 1;
cnf.Save<Config>(szXmlPath);
Config loadxml = Config.Load<Config>(szXmlPath);
cs


사용 예제 입니다.


XmlSerializer을 사용하면 손 쉽게 xml을 컨트롤 할 수 있습니다.


이상입니다.






반응형

+ Recent posts