Использование Lua для изменения строки XML из C ++ - PullRequest
1 голос
/ 07 июня 2011

В моем приложении на C ++ есть строка, содержащая данные XML.Допустим, у меня есть атрибут Number1 и атрибут Number2.

Я хочу отправить эту строку в сценарий Lua и вернуть ее измененную строку XML.Допустим, он добавляет новый атрибут Product со значениями Number1 и Number2.

Это легко сделать с помощью C ++ / Lua, и если да, то как?

Ответы [ 4 ]

1 голос
/ 07 июня 2011

Существует несколько методов для работы с данными XML, перечисленными на Lua Users Wiki .Лучшие варианты включают обратные вызовы C (например, LuaXML и LuaExpat ), так что это имеет смысл только в том случае, если есть другие причины использовать Lua, помимо простого анализа XML.

0 голосов
/ 12 июня 2011

Если вы используете Luabind , это может выглядеть примерно так в C ++:

std::string result = luabind::call_function<std::string>(
    "yourLuaFunction", inputXmlString);

Вы бы, конечно, реализовали yourLuaFunction в Lua и require этот модуль Lua изв вашей C ++ программе.

0 голосов
/ 07 июня 2011

Вы можете сделать это примерно так (но это не может быть на 100% правильно из-за того, что я не в своем уме, и это не включает обработку ошибок):

lua_getglobal(L, "modifyXml"); // push function on stack by name
lua_pushstring(L, xml); // push the xml string as parameter
lua_pcall(L, 1, 1, 0); // call the function with 1 parameter, 1 return value and no error handler
strcpy(xml, lua_tostring(L, -1)); // get the top of the stack as a string and copy it to xml
lua_pop(xml, 1); // remove the string from the stack

Вызванная функция lua моглавыглядеть так:

function modifyXml(xml)
    -- do something with xml here
    return xml
end
0 голосов
/ 07 июня 2011

Я не пользователь Lua ... но просто просматривая документацию, кажется, что вы можете использовать lua_pushstring() для помещения копии строки C с нулевым символом в конце в стек Lua:

http://pgl.yoyo.org/luai/i/lua_pushstring

Хотя нет конкретного определения для таких вещей, как lua_popstring(), вы можете определить что-то подобное себе:

std::string lua_popstring(lua_State *L)
{
    std::string tmp = lua_tostring(L, lua_gettop(L));
    lua_pop(L, 1);
    return tmp;
}

Имея это в виду, вы сможете изменить стандартный пример для передачи данных в Lua и получения результата обратно для ваших целей:

http://lua -users.org / вики / SimpleLuaApiExample

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