13

私の C++ プログラムでは、XML の小さな断片を解析し、いくつかのノードを挿入してから、新しい XML を (できれば としてstd::string) 抽出したいと考えています。
RapidXmlをお勧めしましたが、XML をテキスト文字列として取得する方法がわかりません。
(ノードとアトリビュートを反復して自分で構築することもできますが、確かに私が見逃しているビルドイン機能があります。)
ありがとうございます。

4

8 に答える 8

10

このトピックに関するドキュメントは不十分ですが、ソースを確認することで、機能するコードを取得することができました。通常は重要な情報を含む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;
}
于 2008-09-01T20:52:45.223 に答える
6

print関数 (rapidxml_print.hppユーティリティ ヘッダーにあります) を使用して、XML ノードの内容をstringstream.

于 2008-10-02T12:05:34.507 に答える
4

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());
于 2011-12-09T06:59:13.983 に答える
2

XML を自分で作成する場合は、特殊文字をエスケープすることを忘れないでください。これは見過ごされがちですが、実装されていないと深刻な頭痛の種になる可能性があります。

  • < <
  • > > >
  • & &
  • " "
  • ''
于 2008-09-01T16:34:59.460 に答える
2

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
于 2010-08-14T16:44:41.920 に答える
0

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());
于 2013-02-22T11:50:13.190 に答える
0

まだ Rapid XML に取り組んでいない場合は、いくつかの代替ライブラリをお勧めします。

于 2008-09-01T16:29:22.300 に答える
0

フォローはとても簡単で、

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

ソースコードに「rapidxml_print.hpp」ヘッダーを含めるだけです。

于 2013-02-26T10:16:58.157 に答える