Free Lines Arrow
본문 바로가기
Development/Qt

[Qt] QXml Parser 만들기 2 (code 작성)

by skahn1215 2020. 5. 31.
728x90
반응형

    // 단순하게 xml을 읽어들이는게 아니라

    // xml이 내가 원하는 형태로 만들어 졌는지 확인 후 xml을 읽는 예제 입니다.

    // xsd, xml 만드는 법은 따로 만들 예정입니다.    

 

    QString xsdPath = "/home/work/books.xsd"

    QFile xsdFile( xsdPath ); //미리 만들어논 xsd 파일을 읽어온다 

   

    QXmlSchema schema;    

    if( !xsdFile.open(QIODevice::ReadOnly | QFile::Text) ){
        //TO-DO File을 열지 못했을때 Error 처리 해야함.
    } 

    

    //중요 읽어드린 xsd file을 load 한다.

    schema.load( &xsdFile, QUrl::fromLocalFile(xsdFile.fileName()) );
    if( schema.isValid()){     //xsd 가 정상적인 format으로 작성되어 있는지 확인

        QString xmlFile = "/home/work/books.xml";
        QFile file( xmlFile );
        if( !file.open(QIODevice::ReadOnly | QFile::Text) ){
            //TO-DO File을 열지 못했을때 Error 처리
        }

       QXmlSchemaValidator validator(schema);  //xml 파일이 xsd에 맞게 작성되는지 확인한다
        if (!validator.validate(&file, QUrl::fromLocalFile(file.fileName()))){

        //xml이 xsd형식으로 작성되어 있지 않으면 error 발생 
            return;
        }        

        QFile file2( xmlFile ); //xmlFile을 다시연다 이유는 위에 validator에서 사용했기 때문에 다시 읽어줘야한다.
        if( !file2.open(QIODevice::ReadOnly | QFile::Text) ){
            //TO-DO File을 열지 못했을때 Error 처리

        }
        QXmlStreamReader xml(&file2);
        if( xml.readNextStartElement()) { //xml 한줄 읽는다.
            if( xml.name() == "books" ){  //xml 에서 <books> 인지 확인

                while( xml.readNextStartElement() ){ //xml 에서 <books> 를 찾으면 반복문 수행    

                    if( xml.name() == "book" ){        //xml 에서 <book>을 찾는다.

                        QString title = "";

                        QString author = "";

                        QString genre = "";

                        while( xml.readNextStartElement() ) { //<book>을 찾으면 반복문 실행

                           if( xml.name() == "title" ){            // 각각 해당 <title> <author> <genre> 를 읽어온다

                              title = readElementText();

                           } else if ( xml.name() == "author" ) {

                              author = readElementText();

                           } else if ( xml.name() == "genre" ) {

                              genre = readElementText();

                           }

                               cout<< title.toStdString().constData()<<endl;

                               cout<< author.toStdString().constData()<<endl;

                               cout<< genre.toStdString().constData()<<endl;

                        }

                    }

                }

            }

        }

    }

728x90
반응형

'Development > Qt' 카테고리의 다른 글

[Qt] QImage를 text로 저장하기  (0) 2020.06.10
[Qt] QXml Parser 만들기 1 (xsd xml 만들기)  (0) 2020.05.31

댓글