我有这个变量,一个双指针的矢量,如:
vector<double*> myIntersections;
包含一个向量,其元素都是双精度的二维向量。 我想创建一个XML文件(例如调用myfile.axl - 具有此特定扩展名) 其中文件的每一行都由向量的每个元素给出(因此在每一行上都必须至少包含vector [i] [0],vector [i] [1]的元素)和XML文件的标记是...等(所以用户定义)。 XML应该是这样的文件:
<point name="intersectPoints" size="4" color="rgb">
-2.68 1.82 0.0 255 0 0
-2.63 1.03 0.0 255 0 0
</point>
其中vector [0] [0] = - 2.68,vector [0] [1] = 1.82等等(0.0 255 0 0总是相同) 我知道如何用C ++编写文件(我正在考虑使用fstream库),但我不知道如何创建XML标记(除了字符串以这种方式它们将是字符串)所以我有点丢失。
任何建议都受到欢迎。 感谢您的时间, madalina
答案 0 :(得分:7)
请。请不要自己创建XML。
使用可生成有效且正确的XML文件的库 同样的事情与阅读XML有关。你不打算用ifstream阅读XML,是吗?因此,如果你有XML库来读取XML文件,我很确定这个库允许创建XML。
以下是tinyxml
的示例代码int main()
{
VertexList vl;
vl.push_back( Vertex( Point3d( -2.68, 1.82, 0.0 ), RGB( 255, 0, 0 )));
vl.push_back( Vertex( Point3d( -2.63, 1.03, 0.0 ), RGB( 255, 0, 0 )));
std::ostringstream ss;
std::for_each( vl.begin(), vl.end(), VertexPrint( ss ) );
// write xml
TiXmlDocument doc;
TiXmlDeclaration decl( "1.0", "", "" );
doc.InsertEndChild( decl );
TiXmlElement point( "point" );
TiXmlComment comment( "My Points" );
point.InsertEndChild( comment );
point.SetAttribute("name", "intersectPoints");
point.SetAttribute("size", vl.size());
point.SetAttribute("color", "rgb");
TiXmlText values( ss.str() );
point.InsertEndChild( values );
doc.InsertEndChild( point );
doc.SaveFile( "out.xml" );
}
Vertex
struct Point3d
{
Point3d( double x, double y, double z ):
x_(x), y_(y), z_(z)
{}
double x_;
double y_;
double z_;
};
struct RGB
{
RGB( int r, int g, int b ):
r_(r), g_(g), b_(b)
{}
int r_;
int g_;
int b_;
};
struct Vertex
{
Vertex( const Point3d& coord, const RGB& color ):
coord_( coord ), color_( color )
{}
Point3d coord_;
RGB color_;
};
typedef std::vector< Vertex > VertexList;
和VertexPrint
是
struct VertexPrint
{
VertexPrint( std::ostringstream& result ):
result_( result )
{}
void operator() ( const Vertex& v )
{
result_ << v.coord_.x_ <<" "<< v.coord_.y_ <<" "<< v.coord_.z_ <<" "
<< v.color_.r_ <<" "<< v.color_.b_ <<" "<< v.color_.b_ <<";";
}
std::ostringstream& result_;
};
您还可以考虑boost XML serialization
答案 1 :(得分:5)
结帐TinyXml。它非常轻巧。来自文档:
TinyXML使用文档对象模型(DOM),这意味着XML数据被解析为可以浏览和操作的C ++对象,然后写入磁盘或其他输出流。您还可以使用C ++对象从头开始构建XML文档,并将其写入磁盘或其他输出流。
我在自己的项目中使用了TinyXml,使用起来很愉快。
编辑:除了TinyXML之外,我还使用ticpp(TinyXml ++),它在库的顶部引入了更多C ++功能(异常,模板,迭代器等)。
答案 2 :(得分:1)
如果您只是在编写XML,那么完整的解析器就是一种过度杀伤力。最好看看像Genx
这样的东西答案 3 :(得分:1)
我使用xerces生成XML文件,在内存和CPU使用方面非常昂贵。我最终得到了“内存不足”异常,试图生成只有几十万行XML的文件。如果您可以像其他一些答案所暗示的那样直接生成它,并且正如您的问题暗示应该是可能的那样,我会走那条路。阅读和解析是一个不同的故事,但使用xerces生成XML是过度的。
答案 4 :(得分:0)
假设您使用的是Windows并使用Visual Studio,则可以使用MSXML或其他第三方库。
答案 5 :(得分:0)
cout << "<point name=\"intersectPoints\" size=\"4\" color=\"rgb\">"<<endl;
cout << " "<<-2.68<<" "<<1.82<<" "<<0.0<<" "<<255<<" "<<0<<" "<<0<<"";
这就是我如何以很少的开销编写xml文件,只需将原始xml保存到文件中。
答案 6 :(得分:0)
要读取和写入xml文件,通常使用xml parser (sax or dom based)
我使用过的是一个名为xerces
的sax解析器答案 7 :(得分:0)
我现在正在看TinyXml。我已下载它,希望我能安装它。 我使用MacOSX,我可以看到Makefile for Linux也成功测试了MacOSX,所以我会尝试安装它,如果成功安装就可以使用它。
答案 8 :(得分:0)
对于像这样简单的事情,直接写标签不会很复杂:
void WriteToFile(fstream& file, vector<double *> intersections)
{
file << "<point";
file << " name=\"intersectPoints\"";
file << " size=\"" << intersections.size() "\"";
file << " color=\"rgb\""
file << ">\n"
vector<double *>::iterator it;
for (it=intersections.begin(); it != intersections.end(); it++)
{
file << (*it)[0] << " " << (*it)[1] << " " << (*it)[2] << " ";
file << "255 0 0\n";
}
file << "</point>" << endl;
}