Раньше я использовал RapidXML с несколько проблемами, но эта поставила меня в тупик.
Я создаю журнал временных меток событий приложения, которые внешняя программа может прочитать в воспроизведении любого звука, который произошел в исходном приложении в нужное время.
При инициализации приложения правильно генерируется следующий XML:
<?xml version="1.0" encoding="utf-8"?>
<playbacklog>
<logitem type="general" event="start" timestamp="85639323"/>
</playbacklog>
После добавления следующего элемента документы становятся такими:
<?xml version="1.0" encoding="utf-8"?>
<playbacklog>
<logitem type="general" event="start" timestamp="NUL NUL NUL NUL"/>
<logitem type="audio" event="start" timestamp="86473833">
</playbacklog>
а потом:
<?xml version="1.0" encoding="utf-8"?>
<playbacklog>
<logitem type="general" event="start" timestamp="@NUL NUL' NUL NUL"/>
<logitem type="audio" event="start" timestamp="NUL NUL NUL NUL">
<logitem type="audio" event="stop" timestamp="8654533">
</playbacklog>
С добавлением каждой новой пары start и stop также наблюдается окончательное следующее поведение, при этом значение метки времени изменяется для всех узлов с одинаковым значением атрибута события. :
<?xml version="1.0" encoding="utf-8"?>
<playbacklog>
<logitem type="general" event="start" timestamp="@NUL NUL' NUL NUL"/>
<logitem type="audio" event="start" timestamp="NUL NUL NUL NUL">
<logitem type="audio" event="stop" timestamp="8674519">
<logitem type="audio" event="start" timestamp="NUL NUL NUL NUL">
<logitem type="audio" event="stop" timestamp="8674519">
<logitem type="audio" event="start" timestamp="NUL NUL NUL NUL">
<logitem type="audio" event="stop" timestamp="8674519">
</playbacklog>
Я объявляю документ как таковой в заголовочном файле С++:
private:
rapidxml::xml_document<> outputDocument;
Чтобы создать каждый узел, я использую следующий код:
// tStamp is a typedef'd std::pair containing two std::string values, one for the
// time at which the evet occurred and the other containing the event type.
void AudioLogger::LogEvent( Timestamp* tStamp )
{
rapidxml::xml_node<>* nodeToAdd = outputDocument.allocate_node(rapidxml::node_element, "logitem");
...
nodeToAdd->append_attirbute(outputDocument.allocate_attribute("timestamp", ts->first.c_str()));
...
outputDocument.first_node()->next_sibling()->append_node(nodeToAdd);
}
Значения TimeStamp*, переданные этой функции, хранятся в std::vector, и при добавлении нового вызывается эта функция.
Если у кого-то есть идеи о том, что здесь происходит, это будет огромной помощью. Кроме того, если потребуется дополнительная информация, я также смогу предоставить ее.