C++でXMLファイルを解析する必要があります。私は調査していて、このためのRapidXmlライブラリを見つけました。
doc.parse<0>(xml)
について疑問があります。
xml
は.xmlファイルにすることができますか、それともstring
またはchar *
にする必要がありますか?
string
またはchar *
しか使用できない場合、ファイル全体を読み取ってchar配列に格納し、そのポインターを関数に渡す必要があると思いますか?
コード内のXMLファイルも変更する必要があるため、ファイルを直接使用する方法はありますか?.
RapidXmlでそれができない場合は、C++の他のXMLライブラリをいくつか提案してください。
ありがとう!!!
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
オブジェクトをメモリ(グローバル変数、新規など)に保持して、ドキュメントが有効なままになるようにする必要があります。
私自身は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 */
}
通常、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]);
完全なソースコードのチェックについては: