Programming/XML

델파이에서 XMLDocument 컴포넌트로 XML 읽고 쓰기

통통만두 2010. 6. 30. 15:44
반응형

델파이에서 XMLDocument 컴포넌트로 XML 읽고 쓰기

 

http://blog.naver.com/ckcho/90053728417

 

델파이에서 XMLDocument 컴포넌트로 XML파일을 읽고 쓰는 방법은 말로 설명하기는 좀 어렵고 그냥 소스를 보는 것이 알기 쉬울 것 같다.

 

먼저 uses  XMLDoc, XMLIntf을 추가한다.

 

XML 파일 쓰기

// XML 파일 만들고 쓰기

procedure TForm1.Button1Click(Sender: TObject);

Var

  xdSoft : TXMLDocument;

  xnRoot  : IXMLNode;

  xnChild : IXMLNode;

  xnGrandchild : IXMLNode;

begin

 

  // XML Document 만들기

  xdSoft := TXMLDocument.Create(Application);

  xdSoft.Active := True;

  xdSoft.Encoding:= 'euc-kr';

 

  // 루트 노드 만들기

  xnRoot := xdSoft.AddChild('SoftList');

  // 노드에 속성 설정

  xnRoot.Attributes['LatestUpdate'] := FormatDateTime('YYYY/MM/DD', Now);

 

 

  // 테스트 데이터 추가

###################################################################### //

 

  // 노드 밑에 노드 만들기

  xnChild := xnRoot.AddChild('Soft');

  xnChild.Attributes['Soft_name'] := 'PhotoSharp';

 

  xnGrandchild := xnChild.AddChild('Detail');

  xnGrandchild.Attributes['maker'] := 'Adove';

  xnGrandchild.Attributes['section']  := 'Drawing tool';

  xnGrandchild.Attributes['Price']  := 5000;

 

  xnGrandchild := xnChild.AddChild('Extra');

  xnGrandchild.Attributes['name'] := 'toy';

  xnGrandchild.Attributes['note']  := 'for child';

 

  xnGrandchild := xnChild.AddChild('Stock');

  // 노드 값 설정

  xnGrandchild.NodeVal!ue := 100;

 

  // ---------------------------------------------------------------------- //

 

  xnChild := xnRoot.AddChild('Soft');

  xnChild.Attributes['Soft_name'] := 'OverOffice';

 

  xnGrandchild := xnChild.AddChild('Detail');

  xnGrandchild.Attributes['maker'] := 'OverSoft';

  xnGrandchild.Attributes['section']  := 'office tool';

  xnGrandchild.Attributes['Price']  := 2000;

 

  xnGrandchild := xnChild.AddChild('Extra');

  xnGrandchild.Attributes['name'] := 'notebook';

  xnGrandchild.Attributes['note']  := 'no comment';

 

  xnGrandchild := xnChild.AddChild('Stock');

  xnGrandchild.NodeVal!ue := 50;

 

  // ###################################################################### //

 

  // XML Document 저장하기

  xdSoft.SaveToFile('C:\Test.Xml');

  xdSoft.Free;

 

end;

 

 

■ 만들어진 XML 파일

<?xml version="1.0" encoding="euc-kr" ?>

<SoftList LatestUpdate="2007-10-12">

  <Soft Soft_name="PhotoSharp">

    <Detail maker="Adove" section="Drawing tool" Price="5000" />

    <Extra name="toy" note="for child" />

    <Stock>100</Stock>

  </Soft>

  <Soft Soft_name="OverOffice">

    <Detail maker="OverSoft" section="office tool" Price="2000" />

    <Extra name="notebook" note="no comment" />

    <Stock>50</Stock>

  </Soft>

</SoftList>

 

XML 파일 읽기

// XML 파일 읽어오기

procedure TForm1.Button2Click(Sender: TObject);

Var

  xdSoft : TXMLDocument;

  xnChild : IXMLNode;

  xnGrandchild : IXMLNode;

  i : Integer;

  j : Integer;

  k : Integer;

  sMsg : string;

  sTest : string;

begin

 

  // XML Document 만들기

  xdSoft := TXMLDocument.Create(Application);

 

  // XML Document 불러오기

  xdSoft.LoadFromFile('C:\Test.Xml');

  xdSoft.Active := True;

 

  // 루트 노드가 없을 경우 종료

  if xdSoft.ChildNodes.First = nil then Begin

    Exit;

  End;

 

  // 루트에 딸려있는 노드 분

  For i := 0 To xdSoft.DocumentElement.ChildNodes.count - 1 Do

  Begin

    sMsg := '';

    sTest := '';

 

    xnChild := xdSoft.DocumentElement.ChildNodes[i];

    xnGrandchild := xnChild.ChildNodes[0];

 

    // Soft 노드의 첫 번째 노드의 속한 attribute

    For j :=0 To xnGrandchild.AttributeNodes.Count - 1 Do

    begin

 

    sMsg := sMsg +

      '    ' + xnGrandchild.AttributeNodes.Get(j).NodeName + ' : ' +

      xnGrandchild.AttributeNodes.Get(j).NodeVal!ue + #13

 

    end;

    sTest := sTest + xnChild.NodeName + ' : ';

    sTest := sTest + xnChild.AttributeNodes.Get(0).NodeVal!ue + #13;

 

    xnGrandchild := xnChild.ChildNodes[2];

 

    ShowMessage(

      sTest + #13 +

      sMsg + '    ----------' + #13 +

      '    ' + xnGrandchild.NodeName + ' : ' +

      xnGrandchild.NodeVal!ue

    );

 

  End;

 

  xdSoft.Free;

 

end;

 

 

개인적으로 생각하기에는 XML Data Binding보다 XML Documnet 컴포넌트를 쓰는 것이 더 깔끔하게 프로그램을 만들 수 있을 것 같다.

 


XML 의 노드 삭제에 대해

 

 

<?xml version="1.0" encoding="EUC-KR"?>

<수정이력>

 

<데이터>

<이력>

<수정일자>2009-10-29</수정일자>

<수정내용>문서가 작성되었습니다.</수정내용>

</이력>

</데이터>

 

<데이터>

<이력>

<수정일자>2009-10-28</수정일자>

<수정내용>문서가 작성되었습니다.</수정내용>

</이력>

</데이터>

 

<데이터>

<이력>

<수정일자>2009-11-02</수정일자>

<수정내용>문서가 작성되었습니다.</수정내용>

</이력>

</데이터>

 

</수정이력>

 

다음과 같은 코드로 0번 노드를 삭제 합니다.

XMLDocument.DOMDocument.ChildNodes[1].removeChild(XMLDocument.DOMDocument.ChildNodes[1].ChildNodes[0]);

 

XMLDocument.DOMDocument.ChildNodes[1].removeChild

-> , XML 문서의 1번 노드의 자식 노드를 지운다는 겁니다.

 

0번 노드는 <?xml version="1.0" encoding="EUC-KR"?> 행이 되네요

 

(XMLDocument.DOMDocument.ChildNodes[1].ChildNodes[0])

-> 삭제할 노드 입니다. XMLDocument.DOMDocument.ChildNodes[1] 의 자식 노드 중 0번 노드를 뜻합니다.

--------------------------------

 

이것 또한 어디서 받은건데 출처를 모르겠습니다.

 

문제가 되면 삭제하도록 하겠습니다.


반응형

'Programming > XML' 카테고리의 다른 글

iPhone NSDictionary 와 Array 와 Plist(XML) 파일의 구조  (0) 2010.06.30
XML 문서 기본 구조  (0) 2010.06.30