簡體   English   中英

C ++:如何從RapidXml中提取字符串

[英]C++: How to extract a string from RapidXml

在我的C ++程序中,我想解析一小段XML,插入一些節點,然后提取新的XML(最好是作為std::string )。
RapidXml已被推薦給我,但我看不到如何將XML作為文本字符串檢索回來。
(我可以迭代節點和屬性並自己構建它,但肯定有一個我缺少的內置函數。)
謝謝。

雖然這個主題的文檔很差,但我設法通過查看源代碼獲得了一些工作代碼。 雖然它缺少通常包含重要信息的xml標頭。 這是一個小例子程序,使用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;
}

使用print函數(在rapidxml_print.hpp實用程序頭中找到)將XML節點內容打印到stringstream

rapidxml :: print要求輸出迭代器生成輸出,因此字符串可以使用它。 但這是有風險的,因為我無法知道具有固定長度(如2048字節)的數組是否足以容納XML的所有內容。

執行此操作的正確方法是傳入字符串流的輸出迭代器,以便在將XML轉儲到其中時允許擴展緩沖區。

我的代碼如下:

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());

以下是直接從RapidXML手冊將節點打印到字符串的方法

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

如果您自己構建XML,請不要忘記轉義特殊字符。 這往往被忽視,但如果沒有實施,可能會引起一些嚴重的問題:

  • <&lt;
  • >&gt;
  • && amp;
  • “”
  • ''

使用static_cast <>

例如:

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());

以下很容易,

std::string s;
print(back_inserter(s), doc, 0);
cout << s;

您只需在源代碼中包含“rapidxml_print.hpp”標頭。

如果您尚未致力於Rapid XML,我可以推薦一些替代庫:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM