델파이에서 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 |