C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[31] [강좌] TXMLDocument를 이용한 XML파서 트리 만들어보기
민인학 [h2h1995] 22866 읽음    2002-10-24 22:27
 
우선 C++Builder 6와 Delphi 6의 프로페셔널 에디션에는 TXMLDocument
컴포넌트가 등록되어 있지 않으므로... 등록하기 위해서는 Resource란의 임프님이
올리신 컴포넌트를 다운받아 등록하시면 됩니다.
아니면.. 볼랜드 홈페이지에 가셔서 직접 받으셔도 됩니다.
 
정상적으로 등록이 되었다면 팔레트의 internet 탭에 XML이라 써진 콤포넌트가 등록이 되었을겁니다.
이제 코드만 작성하면 됩니다.
 
1. 폼위에 XML콤포넌트를 떨어트려놓고..
2. TreeView를 폼위에 떨어트립니다. 다음 적당한 크기로 조절을 하시고..
3. 버튼 2개를 떨어트립니다.
   하나의 캡션은 Load XML, 다른 하나는 Save As 이렇게 적습니다..
4. XML콤포넌트의 Properties의 Active를 true로 하신다음
5. DOMVendor를 MSXML로 설정합니다.
6. 이제 Load XML이라 써진 버튼의 OnClick이벤트에 다음과 같이 적습니다.
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        OpenDialog1->InitialDir = ExtractFilePath (Application->ExeName);
        if(OpenDialog1->Execute()) {
                XMLDocument1->LoadFromFile(OpenDialog1->FileName);
                TreeView1->Items->Clear();
                DomToTree(XMLDocument1->DocumentElement, NULL);
        }
}
 
7. 다음 마지막 버튼의 OnClick이벤트에도 다음과 같이 적습니다.
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        SaveDialog1->InitialDir = ExtractFilePath (Application->ExeName);
        if(SaveDialog1->Execute()) {
                XMLDocument1->SaveToFile(SaveDialog1->FileName);
        }
}
 
8. 이제 파싱한 XML문서를 트리에 쭉~~ 붙이는 일만 남았습니다.
   다음과 같이 소스코드를 적성해 주세요..
 
void __fastcall TForm1::DomToTree(_di_IXMLNode XmlNode, TTreeNode *TreeNode)
{
        TTreeNode *NewTreeNode;
        AnsiString NodeText;
        _di_IXMLNode AttrNode;
        if(XmlNode->NodeType != ntElement) {
                return;
        }
        NodeText = XmlNode->NodeName;
        if(XmlNode->IsTextElement) {
                NodeText = NodeText+"="+XmlNode->NodeValue;
        }
        NewTreeNode = TreeView1->Items->AddChild(TreeNode, NodeText);
        for(int i=0; iAttributeNodes->Count; i++) {
                AttrNode = XmlNode->AttributeNodes->Nodes[i];
                AnsiString Temp = AttrNode->NodeName + "[ "+AttrNode->Text+" ]";
                TreeView1->Items->AddChild(NewTreeNode, Temp);
        }
        if(XmlNode->HasChildNodes) {
                for(int i=0; iChildNodes->Count-1; i++) {
                        DomToTree(XmlNode->ChildNodes->Nodes[i], NewTreeNode);
                }
        }
}
 
이제 문제없이 컴파일이 되셨다면..
C++빌더에서 만든 프로젝트파일을 아무거나 하나 열어보세요..
(C++빌더의 프로젝트 파일도 XML 1.0 스펙에 맞추어진 포맷입니다.)
트리로 쭉 나올겁니다..
이상 제가 할려던 강좌는 끝입니다.
 
제가 원래 저희 회사의 프로젝트에 쓰이는 프로그램의 프로젝트파일을 XML 포맷으로
할려고(아직은 아니지만..) 오늘 구글과 빌더 개발자 문서를 뒤져가면서.. 작성해본 것입니다..
의외로 간단한 예제도 찿아볼수가 없더군요..
 
그래서.. 저같은 분들이 또 있을것 같아.. 이렇게 강좌로 올립니다...
소스도 첨부합니다.
그럼.. 좋은 시간 되시길 바라며...

송신영 [palindrome]   2012-09-24 14:32 X
2010에서 Error 발생하여 약간 수정하니 되네요.. 감사합니다.

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

void __fastcall TForm1::DomToTree(_di_IXMLNode XmlNode, TTreeNode *TreeNode)
{
    TTreeNode *NewTreeNode;
    AnsiString NodeText;
    _di_IXMLNode AttrNode;

    if(XmlNode == NULL) return; // 추가.

    if(XmlNode->NodeType != ntElement) {
            return;
    }
    NodeText = XmlNode->NodeName;
    if(XmlNode->IsTextElement) {
            NodeText = NodeText+"="+XmlNode->NodeValue;
    }
    NewTreeNode = TreeView1->Items->AddChild(TreeNode, NodeText);

    for(int i=0; i < XmlNode->AttributeNodes->Count; i++) {
        AttrNode = XmlNode->AttributeNodes->Nodes[i];
        AnsiString Temp = AttrNode->NodeName + "[ "+AttrNode->Text+" ]";
        TreeView1->Items->AddChild(NewTreeNode, Temp);
    }

    if(XmlNode->HasChildNodes) {
        for(int i=0; i< XmlNode->ChildNodes->Count; i++) {
                DomToTree(XmlNode->ChildNodes->Get(i), NewTreeNode); // Nodes[i] 를 Get(i)로 변경.
        }
    }
}

+ -

관련 글 리스트
31 [강좌] TXMLDocument를 이용한 XML파서 트리 만들어보기 민인학 22866 2002/10/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.