2010-07-14 30 views
8

Hãy nói rằng chúng tôi có các tài liệu XML sau:Chuyển đổi QDomElement đến lớp QString/container

<root> 
    <options> 
     ... 
    </options> 
    <children> 
     <child name="first">12345</child> 
     <child name="second"> 
      <additionalInfo>abcd</additionalInfo> 
    </children> 
</root> 

Tôi muốn để có được một chuỗi đại diện của các nút "trẻ em" và thêm chúng vào một mảng (I don' t muốn mất cú pháp XML như vậy .text() không phải là một tùy chọn). Ví dụ, đứa trẻ đầu tiên sẽ như thế nào:

QString child = "<child name="first">12345</child>"; 

tôi đã sử dụng đoạn mã sau để có được các yếu tố:

QDomDocument doc; 
QDomElement element; 
element = xml->documentElement(); 
if(element.isNull() == false) 
{ 
    element = element.firstChildElement("children"); 
    if(element.isNull()) return; 

    element = element.firstChildElement("child"); 
    while(element.isNull() == false) 
    { 
     doc = element.toDocument(); 
     if(doc.isNull() == false) 
     { 
      // save string into array 
      array.append(doc.toString()); 
     } 
     element = element.nextSiblingElement("child"); 
    } 
} 

Vấn đề là các doc.isNull trả luôn sai (trông giống như tôi m không thể chuyển đổi phần tử thành tài liệu). Có cách nào để tôi có thể thực hiện điều này không?

Edit:

Tôi muốn thêm QString đó là không bắt buộc ở đây. Về cơ bản bất kỳ lớp nào có thể được sử dụng sau này để lấy dữ liệu là ok (tôi sẽ lưu các nút này và sử dụng chúng để khởi tạo một đối tượng khác sau này). Điều quan trọng là tôi có thể truy cập các giá trị đó ngay cả khi tài liệu gốc đã bị hủy. Ví dụ: có thể lưu trữ trực tiếp các phần tử đó vào một số mảng (ví dụ: QList), có thể được sử dụng để truy cập chúng sau này.

Trả lời

12

Tôi sẽ thêm một câu trả lời cho câu hỏi của riêng tôi. Không có ý tưởng tại sao, nhưng có vẻ như tôi đã bỏ lỡ chức năng sau trong tài liệu.

void QDomNode::save (QTextStream & str, int indent) const

Nó khá nhiều tất cả tôi cần phải chuyển đổi một nút vào một chuỗi, ví dụ:

QString str; 
QTextStream stream(&str); 
QDomNode node = xml->documentElement().firstChildElement("child"); 

node.save(stream, QDomNode::CDATASectionNode /* = 4 *); 

// process str 
+1

Còn hoạt động ngược lại thì sao? Cho chuỗi tạo ra một QDomNode mà sau này có thể được thêm vào một QDomDocument hiện có? – Pierluigi

+0

@Pierluigi, đó phải là một câu hỏi của chính nó. Nó là khá tham gia. Bạn tạo một 'QDomDocument', sử dụng' setContent() ', sau đó sử dụng' QDomDocumentFragment' để sao chép kết quả trong một tài liệu khác ... –

+0

Nhận xét/* = 4 * không bị đóng. Vì vậy, đây là lỗi cú pháp. –

0

Vì bạn cần định dạng XML, bạn không cần QDomElement hoặc QDomDocument. QDomElementQDomDocument được sử dụng để lấy dữ liệu được lưu trữ trong tài liệu XML.

Bạn chỉ cần truyền tải tệp thông thường.

Mở tập tin sử dụng

bool QFile::open (OpenMode mode) [virtual] 

Bạn có thể đọc toàn bộ nội dung của các tập tin bằng,

QByteArray QIODevice::readAll() 

mà bạn có thể gán nó vào một QString.

Đối với ví dụ

QString entireContents = xmlFile->readAll(); 

Sau đó, bạn có thể chia nhỏ toàn bộ nội dung dựa trên nhân vật newline\n sử dụng

QStringList QString::split (const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const 

Bây giờ mỗi chỉ số tương ứng với mỗi dòng trong file XML. Bạn có thể duyệt qua nó và nhận được các dòng yêu thích mong muốn.

Hy vọng nó sẽ giúp ...

+0

Ty trả lời. Tôi đang sử dụng các lớp QDom * đó vì tôi cũng cần phải phân tích cú pháp/thu thập nhiều dữ liệu trước khi thao tác được thảo luận. Đó là lý do tại sao tôi tò mò nếu những điều này có thể được thực hiện thông qua các lớp học (hoặc bất kỳ lớp học QtXml). Tôi biết có thể phân tích cú pháp tài liệu "bằng tay" và nó có thể hoạt động với một tài liệu đơn giản. Tuy nhiên, trong trường hợp của tôi, tài liệu có thể rất phức tạp và tôi cần các hoạt động tương tự ở nhiều nơi. Về cơ bản tất cả những gì tôi biết là phải có một nút trên một mức độ nhất định của cây XML và tôi cần phải có được mọi nhánh bên dưới nó. – Routa

0

Vâng tôi nghĩ rằng bạn không thể làm excactly gì bạn muốn với các lớp XML Qt, nhưng chúng ta có thể chỉ đơn giản là tái tạo lại chuỗi mình (có lẽ không phù hợp với bản gốc trong 100 %, nhưng với cùng ý nghĩa), dựa trên các phương thức mà các lớp XML Qt cung cấp.

EDIT: nhỏ đoạn mã mà có thể làm điều (chưa được kiểm tra):

QString domElementToRawXML(const QDomElement& elem) 
{ 
    QString head = "<"+elem.tagName(); 
    QDomNamedNodeMap attrs = elem.attributes(); 
    for(int i = 0; i<attrs.size(); ++i) 
    { 
     QDomAttr attr = attrs.item(i).toAttr(); 
     head += 
      QString::fromLatin1(" %0=\"%1\"") 
      .arg(attr.name()) 
      .arg(attr.value()); 
    } 
    head += ">"; 
    return head + elem.text() + "</"+elem.tagName()+">"; 
} 
+0

Cảm ơn bạn đã trả lời. Dựa trên những câu trả lời này có vẻ như tôi phải từ bỏ chiến lược tiết kiệm các nút (như một chuỗi) và tìm ra một cái gì đó khác. – Routa

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