// 단순하게 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;
}
}
}
}
}
}
'Development > Qt' 카테고리의 다른 글
[Qt] QImage를 text로 저장하기 (0) | 2020.06.10 |
---|---|
[Qt] QXml Parser 만들기 1 (xsd xml 만들기) (0) | 2020.05.31 |
댓글