создавать XML-файлы из программы на C ++ - PullRequest
7 голосов
/ 31 марта 2009

У меня есть эта переменная, вектор двойных указателей, таких как:

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>

где вектор [0] [0] = - 2,68, вектор [0] [1] = 1,82 и т. Д. (0,0 255 0 0 всегда одинаково) Я знаю, как написать файл на C ++ (я думал об использовании библиотеки fstream), но я не знаю, как создавать теги XML (кроме строк таким образом, что они будут через строки), поэтому я немного потерял.

любые предложения приветствуются. Спасибо за ваше время, Madalina

Ответы [ 9 ]

7 голосов
/ 31 марта 2009

пожалуйста. Пожалуйста, не создавайте XML самостоятельно.

Используйте библиотеки, которые будут генерировать действительный и правильный файл XML.
То же самое относится и к чтению XML. Вы не собираетесь читать XML с ifstream? Поэтому, если у вас есть библиотека 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_;
};

Вы также можете рассмотреть повысить сериализацию XML

5 голосов
/ 31 марта 2009

Выезд TinyXml . Это очень легкий. Из документации:

TinyXML использует объектную модель документа (DOM), что означает, что данные XML анализируются в объекты C ++, которые можно просматривать и манипулировать ими, а затем записывать на диск или в другой поток вывода. Вы также можете создать XML-документ с нуля с помощью объектов C ++ и записать его на диск или в другой поток вывода.

Я использовал TinyXml в своих собственных проектах, и мне очень приятно его использовать.

Редактировать: В дополнение к TinyXML я также использую ticpp (TinyXml ++), который вводит дополнительные функции C ++ (исключения, шаблоны, итераторы и т. Д.) Поверх библиотеки.

1 голос
/ 31 марта 2009

Я использовал xerces для генерации XML-файлов, и это очень дорого с точки зрения использования памяти и процессора. В конце концов я получил исключения «недостаточно памяти», пытаясь сгенерировать файлы с несколькими сотнями тысяч строк XML. Если вам удастся сгенерировать его напрямую, как предлагали некоторые другие ответы, и, как предполагает ваш вопрос, это возможно, я бы пошел этим путем. Чтение и анализ - это отдельная история, но использование xerces для генерации XML излишне.

1 голос
/ 31 марта 2009

Если вы просто пишете XML, полноценный парсер - это излишнее убийство. Лучше взглянуть на что-то вроде Genx

0 голосов
/ 31 марта 2009

Для чего-то простого, подобного этому, написание тегов напрямую не будет очень сложным:

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;
}
0 голосов
/ 31 марта 2009

Я сейчас смотрю на TinyXml. Я скачал его, я надеюсь, что смогу установить его. Я использую MacOSX, я вижу, что Makefile для Linux также был успешно протестирован для MacOSX, поэтому я постараюсь установить его, и если он был успешно установлен, то работал с ним.

0 голосов
/ 31 марта 2009

Для чтения и записи XML-файлов вы обычно используете XML-анализатор (на основе sax или dom)

Я использовал синтаксический анализатор саксофона xerces

0 голосов
/ 31 марта 2009

вот взломать ...

cout << "<point name=\"intersectPoints\" size=\"4\" color=\"rgb\">"<<endl;
cout << "  "<<-2.68<<" "<<1.82<<" "<<0.0<<" "<<255<<" "<<0<<" "<<0<<"";

так я пишу XML-файлы с небольшими накладными расходами, просто сохраняю в файл необработанный XML.

0 голосов
/ 31 марта 2009

Если вы работаете в Windows и используете Visual Studio, вы можете использовать MSXML или другие сторонние библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...