私のC++プログラムでは、小さなXMLを解析し、いくつかのノードを挿入してから、新しいXML(好ましくはstd::string
)を抽出します。
RapidXmlが推奨されていますが、XMLをテキスト文字列として取得する方法はわかりません。
(私はノードと属性を繰り返し処理して自分で構築することができますが、確かに欠けている機能のビルドがあります)
ありがとうございます。あなたはまだ急速なXMLにコミットされていない場合はC++:RapidXmlから文字列を抽出する方法
12
A
答えて
9
Althougこのトピックではドキュメンテーションが貧弱なため、ソースを参照して作業コードを取得することができました。通常は重要な情報が含まれているxmlヘッダーがありません。
#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;
}
0
が、私はいくつかの代替ライブラリをお勧めすることができます:
のXercesを - これはおそらく事実上のC++実装です。
XMLite - 私はこの最小限のXML実装で多少の運がありました。あなたはXMLを自分で構築した場合は、特殊文字をエスケープすることを忘れないでくださいhttp://www.codeproject.com/KB/recipes/xmlite.aspx
2
での記事を参照してください。これは見落とされる傾向にあるが、それが実装されていない場合は、いくつかの深刻な頭痛を引き起こす可能性があります:
- < & LT;
- > & GT。
- & &アンペア。
- " & QUOT。
- ' & 4'-
6
2
がまっすぐ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
2
rapidxml :: printは出力を生成する出力イテレータをreuqires、その文字列は、それに対応しています。しかし、固定長(2048バイトなど)の配列がXMLのすべての内容を保持するのに十分な長さかどうかわからないため、これは危険です。
これを行う正しい方法は、文字列ストリームの出力イテレータを渡すことで、XMLがその中にダンプされているときにバッファを展開できるようにすることです。
私のコードは次のようなものです:あなたが唯一のに必要
std::string s;
print(back_inserter(s), doc, 0);
cout << s;
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());
0
使用することは>
<例ををstatic_cast 「rapidxml _print.hpp "ヘッダーをソースコードに追加します。
0
に続いて、非常に簡単です:
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());
関連する問題
- 1. ドメイン名文字列から単語を抽出する方法
- 2. URLから部分文字列を抽出する方法
- 3. 文字列から括弧データを抽出する方法
- 4. 文字列から文字列を抽出する
- 5. Objective-Cの文字列から文字列を抽出する
- 6. 文字列から文字列とintを抽出します。
- 7. 文字列から部分文字列を抽出します。
- 8. JSONオブジェクトから文字列を抽出
- 9. シェル:ソースコードから文字列を抽出
- 10. 文字列からコンマで区切った数字を抽出する方法
- 11. 文字列配列からname属性を抽出する方法は?
- 12. 英数字の文字列から数字を抽出する
- 13. 文字列からのPHPテキスト抽出
- 14. 文字列からの抽出
- 15. 文字列からの抽出 - Ruby
- 16. 抽出文字列
- 17. テキストの文字列から数字を抽出する - Excel
- 18. SQL文字列から値を抽出して出力する
- 19. 文字列からGRANT文を抽出する正規表現
- 20. Java - 文字列からXML文書を抽出する
- 21. 大きな文字列からワイルドカードを含む文字列を抽出する
- 22. IMDbPYの「粗利益」文字列から金額を抽出する方法
- 23. 文字列のセットから製品名を抽出する方法は? (PHP)
- 24. StringTokenizerから抽出した文字列を比較する方法
- 25. C言語の文字列から特定の値を抽出する方法#
- 26. Macでバイナリからハードコーディングされた文字列を抽出する方法は?
- 27. beautifulsoup - 結果の文字列からリンクを抽出する方法は?
- 28. 巨大な文字列から部分文字列を抽出する
- 29. 文字列から部分文字列をRegexで抽出する
- 30. 文字列のようなパスを文字列から抽出する
これらのライブラリでは数百パーセントのスピード違反を忘れてはいけませんが、どちらもRapidXMLよりも多くの機能を備えています。 –
vtd-xmlはrapidXMLよりも適合性が高く、強力です。 –