2012-02-23 1 views
-1

Увидев documentation of XmlDocument::parse(Ch*) in RapidXml, мне остается не думать о том, что буфер символов является «не const». Я не уверен, как это будет работать вообще, когда буфер должен расти любыми такими модификациями парсера. Будет ли библиотека расти? если я прошу его разобрать, он должен просто разбираться правильно? в противном случае его следует называть ParseAndPossibleModifyButLetMeKnowIfYouHadToRegrowTheBufferInWhichCaseHeyCheckThisFlagAndCopyThisPointer или что-то в этом роде.Может ли RapidXML API вырастить буфер?

Я что-то не хватает? Я хочу понять эту библиотеку, потому что я хочу что-то, что просто использовать для открытия и добавления/редактирования xml-файлов на лету с C++, но если есть более простые/лучшие альтернативы , не стесняйтесь делать такие предложения, как ответы !!

+0

Что касается альтернатив, [у нас есть вопрос для этого] (http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c). –

ответ

1

RapidXML старается изо всех сил быть парсером на месте. Когда он не может, он будет выделять память (связанную с временем жизни xml_document<>), но только при необходимости. Это довольно редко, когда строка должна фактически расти из-за чтения XML.

Он изменит содержимое строки (если вы не установили флаг без модификации), и его объекты будут содержать ссылки на эту строку. Поэтому вам нужно убедиться, что буфер выживает достаточно долго. Но кроме этого, не о чем беспокоиться.

+0

Что это означает только при необходимости? рост буфера может фактически распределить на новый адрес, поэтому старый указатель может быть недействительным; как quickXml дает мне указатель на новый буфер, когда это происходит? – lurscher

+0

@ lurscher: буфер * не может * расти. Однако преобразование строк в RapidXML может в некоторых случаях сделать строку больше, чем ее местоположение. Следовательно, он выделяет * новую * внутреннюю память для хранения этой строки, поскольку эта строка больше не может быть изменена на месте. Новая память связана с 'xml_document <>'. –

+0

ой! нормально, поэтому, если добавить некоторые узлы xml в конце документа, например, xml_document :: print() может вернуть новый буфер? есть ли способ заставить его печатать напрямую в файл? – lurscher

1

Rapidxml никогда не должен вырастить буфер. По счастливому совпадению UTF8-кодированный XML всегда имеет достаточно пространства вокруг строк, чтобы вставлять завершающие нулевые символы и расширять встроенные объекты символов на месте.

Таким образом, единственная сделанная модификация будет содержать содержимое буфера, а не его размер.