2012-12-19 2 views
6

출력이 포맷되지 않는 XML 파일이 있습니다. 즉, 모든 출력은 한 줄로되어 있지만 태그별로 태그를 나누고 싶습니다.C++ 또는 Qt 형식의 XML 파일

예 : -

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><Analyser> <JointDetails>    <Details><StdThickness> T </StdThickness><Thickness_num> 0.032 </Thickness_num></Details> </JointDetails></Analyser> 

하지만 난이 ::처럼하고 싶은

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<Analyser> 
<JointDetails> 
    <Details> 
<StdThickness> T </StdThickness> 
<Thickness_num> 0.032 </Thickness_num> 
</Details> 
    </JointDetails> 
</Analyser> 

이 XML 파일이 이미 있기 때문에 XML 파일을을 writting 동안 그것을하는 것이 좋습니다 해달라고하지만 지금은 그것을 포맷해야하십시오 상술 한 바와 같이 .

미리 감사드립니다.

+1

[TinyXML]와 XML 읽기 (http://www.grinninglizard.com/tinyxml/), 꽤 인쇄에있는 기본값 TiXMLPrinter 그것을 밖으로 인쇄 할 수 있습니다. –

답변

1
void format(void) 
{ 
    QDomDocument input; 

    QFile inFile("D:/input.xml"); 
    QFile outFile("D:/output.xml"); 

    inFile.open(inFile.Text | inFile.ReadOnly); 
    outFile.open(outFile.Text | outFile.WriteOnly); 

    input.setContent(&inFile); 

    QDomDocument output(input); 
    QTextStream stream(&outFile); 
    output.save(stream, 2); 
} 
2

Qt를 사용하는 경우 QXmlStreamReader로 읽고 QXmlStreamWriter로 쓰거나 QDomDocument로 구문 분석 한 다음 다시 QString로 변환 할 수 있습니다. QXmlStreamWriter W QDomDocument는 형식화를 지원합니다.

0

당신이 출력> <의 각 인스턴스 사이에 하나의 문자를 추가 할 수 있습니다 ++ C 활용 : N < \>에 <> 변경하여 각 태그는 새에 인쇄됩니다 (이 줄 바꿈에 대한 비 인쇄 문자를 추가합니다) 선. 위에서 언급 한 것처럼 API를 사용하는 방법이 있지만 콘솔 출력을 위해 제안하는 작업을 수행하는 간단한 방법이나 XML이 텍스트 편집기와 같이 태그 당 새 줄로 흘러가도록 \ n 잘 작동해야합니다. .

출력이 더 필요한 경우 \n (개행) 및 \t (탭)을 사용하여 출력을 레이아웃하거나보다 정교한 표현을 다시 사용하면 API를 활용할 수 있습니다.

+0

사실 나는 위의 출력을 파일에 저장하려고합니다. 하지만 \ n 콘솔에 대해서만 작동합니다 생각합니다. 파일에 저장하는 방법을 제안 해 주시겠습니까? – Kenta

+0

어떻게 파일로 스트리밍 하시겠습니까? 예를 들어'\ n'은 XML 문자열을 텍스트 파일로 저장하는 경우에도 작동합니다. 그래야 그렇게 할 수 있습니다. 추가 API를 사용하여 xml 출력을 가장 잘 나타낼 수는 있지만, 자신의 시스템을 작성하는 것의 이점은 모든 것이 어떻게 작동 하는지를 알 수 있다는 것입니다. 그리고 당신은 당신의 목적에 맞는 시스템을 작고 효율적으로 작성할 수 있습니다. 코스에 대한 그 말은 정말로 필요합니다.하지만 더 자세한 답변이 필요하면 최선을 다하겠습니다. 실제로 파일에 내용을 저장하는 방법에 대한 추가 정보가 필요합니다. :) – GMasucci

1

QT에 의존하지 않는 간단하고 강력한 솔루션을 원할 경우 libxml2를 사용할 수 있습니다. (어쨌든 QT를 사용하는 경우, 단지 프랭크 Osterfeld는 말을 사용합니다.)

xmlDoc* xdoc = xmlReadFile(BAD_CAST"myfile.xml", NULL, NULL, 0); 
xmlSaveFormatFile(BAD_CAST"myfilef.xml", xdoc, 1); 
xmlFreeDoc(xdoc); 

나는 나의 C++ wrapper of libxml2에서 당신을 관심을 수 있습니까?

편집 : 당신은 메모리에있는 XML 문자열을 가지고 있다면, 당신은 또한 당신이 원하는 일을해야 QXmlStreamReaderQXmlStreamWriter를 사용 xmlReadDoc ... But it doesn't stop there.

5

를 사용할 수 있습니다 . QXmlStreamWriter::setAutoFormatting(true)은 다른 행의 XML 서식을 지정하고 올바른 들여 쓰기를 사용합니다. QXmlStreamReader::isWhitespace()을 사용하면 태그 사이의 불필요한 공백을 필터링 할 수 있습니다.

QString xmlIn = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>" 
       "<Analyser><JointDetails>    <Details><StdThickness>" 
       " T </StdThickness><Thickness_num> 0.032 </Thickness_num>" 
       "</Details> </JointDetails></Analyser>"; 
QString xmlOut; 

QXmlStreamReader reader(xmlIn); 
QXmlStreamWriter writer(&xmlOut); 
writer.setAutoFormatting(true); 

while (!reader.atEnd()) { 
    reader.readNext(); 
    if (!reader.isWhitespace()) { 
     writer.writeCurrentToken(reader); 
    } 
} 

qDebug() << xmlOut; 
+0

답장을 보내 주셔서 감사합니다.그러나 두 번째 반복 동안 그것의 파괴. – Kenta

+0

위반과 관련하여 어떤 의미입니까? 프로그램이 충돌합니까? 아니면 예기치 않은 결과가 나옵니까? 이 테스트 프로그램은 원하는 출력을 출력해야합니다 : https://gist.github.com/4343585 – stijnvn

+0

예, 프로그램이 충돌합니다. – Kenta