代码之家  ›  专栏  ›  技术社区  ›  hamishmcn

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

  •  13
  • hamishmcn  · 技术社区  · 16 年前

    在我的C++程序中,我想解析一小段XML,插入一些节点,然后提取新的XML(最好是作为一个)。 std::string )
    RapidXml 已经向我推荐了,但我看不到如何将XML作为文本字符串检索回来。
    (我可以对节点和属性进行迭代并自己构建它,但肯定有一个内置函数是我所缺少的。)
    谢谢您。

    8 回复  |  直到 8 年前
        1
  •  9
  •   Thomas Watnedal    16 年前

    尽管文档在这个主题上很差,但我还是通过查看源代码获得了一些可工作的代码。尽管它缺少通常包含重要信息的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;
    }
    
        2
  •  6
  •   kaalus    16 年前

    使用 print 功能(在 rapidxml_print.hpp 实用程序头)将XML节点内容打印到 stringstream .

        3
  •  3
  •   danath    13 年前

    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());
    
        4
  •  2
  •   Adam Tegen    16 年前

    如果您自己构建XML,请不要忘记转义特殊字符。这往往被忽视,但如果不实施,可能会导致一些严重的头痛:

    • <和;
    • >和;
    • &和;
    • “&>”
    • “&”
        5
  •  2
  •   Petrus Theron    14 年前

    以下是如何将节点直接打印到字符串 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
    
        6
  •  0
  •   Adam Tegen    16 年前

    如果您还没有致力于快速XML,我可以推荐一些替代库:

        7
  •  0
  •   uilianries    11 年前

    使用静态\u cast<gt;

    前任:

    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());
    
        8
  •  0
  •   duckduckgo    11 年前

    跟随是很容易的,

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

    您只需要在源代码中包含“rapidxml\u print.hpp”头。