Trong chương trình C++ của tôi, tôi muốn phân tích một đoạn XML nhỏ, chèn một số nút, sau đó trích xuất XML mới (tốt nhất là std::string
).
RapidXml đã được đề xuất cho tôi, nhưng tôi không thể xem cách lấy lại XML dưới dạng chuỗi văn bản.
(Tôi có thể lặp lại các nút và thuộc tính và tự xây dựng nó, nhưng chắc chắn có một chức năng xây dựng mà tôi đang thiếu.)
Cảm ơn bạn.C++: Cách trích xuất một chuỗi từ RapidXml
Trả lời
Althoug tài liệu kém về chủ đề này, tôi đã quản lý để lấy mã hoạt động bằng cách xem nguồn. Mặc dù thiếu tiêu đề xml thường chứa thông tin quan trọng. Dưới đây là một chương trình nhỏ ví dụ mà những gì bạn đang tìm kiếm sử dụng rapidxml:
#include <iostream>
#include <sstream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
int main(int argc, char* argv[]) {
char xml[] = "<?xml version=\"1.0\" encoding=\"latin-1\"?>"
"<book>"
"</book>";
//Parse the original document
rapidxml::xml_document<> doc;
doc.parse<0>(xml);
std::cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
//Insert something
rapidxml::xml_node<> *node = doc.allocate_node(rapidxml::node_element, "author", "John Doe");
doc.first_node()->append_node(node);
std::stringstream ss;
ss <<*doc.first_node();
std::string result_xml = ss.str();
std::cout <<result_xml<<std::endl;
return 0;
}
Nếu bạn chưa cam kết XML nhanh, tôi có thể giới thiệu một số thư viện khác:
Xerces - Đây có lẽ là defacto C++ thực hiện.
XMLite - Tôi đã có một số may mắn với việc triển khai XML tối thiểu này. Xem bài viết tại http://www.codeproject.com/KB/recipes/xmlite.aspx
Nếu bạn tự xây dựng XML, đừng quên thoát khỏi các ký tự đặc biệt. Này có xu hướng bị bỏ qua, nhưng có thể gây ra một số đau đầu nghiêm trọng nếu nó không được thực hiện:
- < & lt;
- > & gt;
- & & amp;
- " & quot;
- ' & apos;
Dưới đây là làm thế nào để in một nút để một chuỗi thẳng từ RapidXML Manual:
xml_document<> doc; // character type defaults to char
// ... some code to fill the document
// Print to stream using operator <<
std::cout << doc;
// Print to stream using print function, specifying printing flags
print(std::cout, doc, 0); // 0 means default printing flags
// Print to string using output iterator
std::string s;
print(std::back_inserter(s), doc, 0);
// Print to memory buffer using output iterator
char buffer[4096]; // You are responsible for making the buffer large enough!
char *end = print(buffer, doc, 0); // end contains pointer to character after last printed character
*end = 0; // Add string terminator after XML
rapidxml :: in reuqires một iterator đầu ra để tạo ra sản lượng, do đó, một chuỗi ký tự làm việc với nó.Nhưng điều này là nguy hiểm vì tôi không thể biết liệu một mảng có độ dài cố định (như 2048 byte) đủ dài để chứa tất cả nội dung của XML.
Cách đúng để thực hiện điều này là chuyển qua trình lặp đầu ra của luồng chuỗi để cho phép bộ đệm được mở rộng khi XML đang được đổ vào nó.
Mã của tôi là như dưới đây:
std::stringstream stream;
std::ostream_iterator<char> iter(stream);
rapidxml::print(iter, doc, rapidxml::print_no_indenting);
printf("%s\n", stream.str().c_str());
printf("len = %d\n", stream.str().size());
sử dụng static_cast <>
Ex:
rapidxml::xml_document<> doc;
rapidxml::xml_node <> * root_node = doc.first_node();
std::string strBuff;
doc.parse<0>(xml);
.
.
.
strBuff = static_cast<std::string>(root_node->first_attribute("attribute_name")->value());
Tiếp theo là rất dễ dàng,
std::string s;
print(back_inserter(s), doc, 0);
cout << s;
Bạn chỉ cần bao gồm "quickxml _print.hpp "tiêu đề trong mã nguồn của bạn.
- 1. C++ - trích xuất các số từ một chuỗi
- 2. Cách trích xuất một số động từ một chuỗi
- 3. Trích xuất URL từ chuỗi
- 4. Trích xuất ký tự từ chuỗi
- 5. Trích xuất chuỗi từ giữa các trích dẫn
- 6. Trích xuất một chuỗi từ một khung dữ liệu
- 7. Thời gian trích xuất từ ngày Chuỗi
- 8. cách trích xuất thuộc tính name từ mảng chuỗi?
- 9. Trích xuất thẻ băm từ chuỗi
- 10. C++ rapidxml node_iterator ví dụ?
- 11. Bash: trích xuất một phần của chuỗi
- 12. php để trích xuất một chuỗi từ dấu nháy kép
- 13. R trích xuất một phần của chuỗi
- 14. C# trích xuất dữ liệu từ XML
- 15. cách trích xuất từ dispatch.json.JsObject
- 16. trích xuất các từ từ một tệp
- 17. Mục tiêu-C: Cách tốt nhất để trích xuất chuỗi con từ NSString?
- 18. Trích xuất chuỗi số nguyên
- 19. trích xuất âm thanh từ một fla
- 20. Sử dụng regex để trích xuất nhiều số từ chuỗi
- 21. Mã Ruby để trích xuất máy chủ từ chuỗi URL
- 22. Trích xuất các chuỗi từ các lớp Java
- 23. Trích xuất từ cuối cùng trong câu/chuỗi?
- 24. Trích xuất kích thước hình ảnh từ chuỗi Base64
- 25. Cách trích xuất URL từ văn bản
- 26. Cách trích xuất Google Từ đồng nghĩa
- 27. Trích xuất X số từ xung quanh chuỗi tìm kiếm đã cho trong một chuỗi
- 28. Trích xuất chuỗi con từ một chuỗi trong Ruby bằng cách sử dụng cụm từ thông dụng
- 29. Trích xuất thẻ tập lệnh từ chuỗi HTML
- 30. Trích xuất EXIF từ JPEG
Đừng quên vài trăm phần trăm tốc độ phạt cho các thư viện này - mặc dù cả hai đều có nhiều tính năng hơn RapidXML. –
vtd-xml là một lib khác phù hợp hơn và mạnh hơn fastXML –