web-dev-qa-db-ja.com

RapidXmlでXMLファイルを解析する方法

C++でXMLファイルを解析する必要があります。私は調査していて、このためのRapidXmlライブラリを見つけました。

doc.parse<0>(xml)について疑問があります。

xmlは.xmlファイルにすることができますか、それともstringまたはchar *にする必要がありますか?

stringまたはchar *しか使用できない場合、ファイル全体を読み取ってchar配列に格納し、そのポインターを関数に渡す必要があると思いますか?

コード内のXMLファイルも変更する必要があるため、ファイルを直接使用する方法はありますか?.

RapidXmlでそれができない場合は、C++の他のXMLライブラリをいくつか提案してください。

ありがとう!!!

Ashd

20
ashd

RapidXmlには、これを行うためのクラスrapidxml::file の中に rapidxml_utils.hppファイル。何かのようなもの:

#include "rapidxml_utils.hpp"

int main() {
    rapidxml::file<> xmlFile("somefile.xml"); // Default template is char
    rapidxml::xml_document<> doc;
    doc.parse<0>(xmlFile.data());
...
}

xmlFileオブジェクトにはXMLのすべてのデータが含まれていることに注意してください。つまり、オブジェクトがスコープから外れて破棄されると、doc変数は安全に使用できなくなります。関数内でparseを呼び出す場合は、xmlFileオブジェクトをメモリ(グローバル変数、新規など)に保持して、ドキュメントが有効なままになるようにする必要があります。

29
Superfly Jon

私自身はC++の初心者ですが、解決策を共有したいと思いました。

YMMV!

これでSiCraneに叫びます thread :-そして 'string'をベクトルに置き換える---(annoに感謝)

コメントして、私も学ぶのを手伝ってください!私はこれに非常に新しいです

とにかく、これは良いスタートのために働くようです:

#include <iostream>
#include <fstream>
#include <vector>

#include "../../rapidxml/rapidxml.hpp"

using namespace std;

int main(){
   ifstream myfile("sampleconfig.xml");
   rapidxml::xml_document<> doc;

   /* "Read file into vector<char>"  See linked thread above*/
   vector<char> buffer((istreambuf_iterator<char>(myfile)), istreambuf_iterator<char>( ));

   buffer.Push_back('\0');

   cout<<&buffer[0]<<endl; /*test the buffer */

   doc.parse<0>(&buffer[0]); 

   cout << "Name of my first node is: " << doc.first_node()->name() << "\n";  /*test the xml_document */


}
9
FlipMcF

通常、XMLをディスクからstd::stringに読み取り、次にその安全なコピーをstd::vector<char>に作成します。

string input_xml;
string line;
ifstream in("demo.xml");

// read file into input_xml
while(getline(in,line))
    input_xml += line;

// make a safe-to-modify copy of input_xml
// (you should never modify the contents of an std::string directly)
vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.Push_back('\0');

// only use xml_copy from here on!
xml_document<> doc;
// we are choosing to parse the XML declaration
// parse_no_data_nodes prevents RapidXML from using the somewhat surprising
// behavior of having both values and data nodes, and having data nodes take
// precedence over values when printing
// >>> note that this will skip parsing of CDATA nodes <<<
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

完全なソースコードのチェックについては:

C++を使用してxmlファイルから行を読み取る

1
karlphillip

manual は次のことを伝えます。

関数xml_document :: parse

[...]指定されたフラグに従ってゼロで終了するXML文字列を解析します。

RapidXMLは、ファイルから文字データをロードします。 anno のようにファイルをバッファに読み込むか、代わりにメモリマッピングテクニックを使用します。 (ただし、parse_non_destructiveフラグが最初です。)

0
Martin Ba