2012-12-19 29 views
6

Tôi có tệp xml nơi đầu ra không được định dạng. Điều đó có nghĩa là tất cả các kết quả đầu ra đều nằm trong một dòng nhưng tôi muốn chia nhỏ nó bằng thẻ.Định dạng tệp XML bằng C++ hoặc Qt

Ví dụ: -

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

Nhưng tôi muốn làm điều đó như thế này ::

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

Xin vui lòng không đề nghị để làm điều đó trong khi writting file XML vì file xml này đã có nhưng bây giờ tôi phải định dạng nó Như được đề cập ở trên .

Xin cảm ơn trước.

+1

Đọc XML với [TinyXML] (http://www.grinninglizard.com/tinyxml/), in nó ra với TiXMLPrinter, mặc định là in ấn đẹp. –

Trả lời

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

Nếu bạn đang sử dụng Qt, bạn có thể đọc nó bằng QXmlStreamReader và viết nó với QXmlStreamWriter hoặc phân tích cú pháp dưới dạng QDomDocument và chuyển đổi thành QString. Cả hai định dạng hỗ trợ QXmlStreamWriter và QDomDocument.

0

Bằng cách sử dụng C++ bạn có thể thêm một nhân vật duy nhất giữa mỗi trường hợp của> < cho đầu ra: bằng cách thay đổi> < đến> \ n < (điều này cho biết thêm các nhân vật không được in cho một dòng mới) mỗi thẻ sẽ in lên một mới hàng. Tuy nhiên, có một số cách để thực hiện điều này như đã đề cập ở trên, nhưng một cách đơn giản để làm những gì bạn đề xuất cho đầu ra của bàn điều khiển, hoặc để XML chuyển sang các dòng mới trên mỗi thẻ trong một trình soạn thảo văn bản, \ n sẽ hoạt động tốt .

Nếu bạn cần một đầu ra thanh lịch hơn, bạn có thể tự mình viết mã bằng cách sử dụng \n (dòng mới) và \t (tab) để đặt đầu ra của bạn hoặc sử dụng api nếu bạn xem lại một biểu diễn phức tạp hơn.

+0

Thực ra tôi muốn lưu trữ đầu ra ở trên vào một tệp. Nhưng tôi nghĩ rằng \ n sẽ chỉ làm việc cho giao diện điều khiển. Bạn có thể đề nghị một cái gì đó để lưu trữ nó trong một tập tin. – Kenta

+0

Bạn đang phát trực tuyến tới tệp như thế nào? Ví dụ sau đó '\ n' cũng sẽ hoạt động nếu bạn đang lưu chuỗi xml của bạn dưới dạng tệp văn bản, vì vậy bạn cũng nên làm như vậy. Bạn có thể sử dụng một API bổ sung mà tôi cho rằng để tạo ra đầu ra xml của bạn, tuy nhiên, những lợi thế để viết hệ thống của riêng bạn là bạn có thể thấy mọi thứ hoạt động như thế nào; và, bạn có thể viết như một hệ thống nhỏ và hiệu quả như bạn cần cho các mục đích của bạn. Ngựa của nó cho các khóa học thực sự, nhưng nếu bạn cần một câu trả lời chi tiết hơn, tôi sẽ làm tốt nhất của tôi, chỉ cần một số thông tin thêm về cách bạn đang thực sự lưu nội dung để tập tin. :) – GMasucci

1

Nếu bạn muốn một giải pháp mạnh mẽ đơn giản không dựa trên QT, bạn có thể sử dụng libxml2. (Nếu bạn đang sử dụng QT dù sao, chỉ cần sử dụng những gì Frank Osterfeld nói.)

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

Tôi có thể bạn quan tâm trong C++ wrapper of libxml2 của tôi?

Edit: Nếu bạn tình cờ có chuỗi XML trong bộ nhớ, bạn cũng có thể sử dụng xmlReadDoc ... But it doesn't stop there.

5

Sử dụng một QXmlStreamReaderQXmlStreamWriter nên làm những gì bạn muốn. QXmlStreamWriter::setAutoFormatting(true) sẽ định dạng XML trên các dòng khác nhau và sử dụng thụt đầu dòng chính xác. Với QXmlStreamReader::isWhitespace() bạn có thể lọc ra khoảng trắng thừa giữa các thẻ.

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

Cảm ơn bạn đã trả lời.Nhưng đột phá của nó trong lần lặp thứ hai. – Kenta

+0

Bạn có ý gì khi vi phạm? Chương trình của bạn có bị lỗi không? Hay bạn có được kết quả không mong muốn? Chương trình thử nghiệm này sẽ in kết quả bạn muốn: https://gist.github.com/4343585 – stijnvn

+0

ya chương trình bị lỗi. – Kenta

Các vấn đề liên quan