Pugixml C++ Разбор логического значения

Вот моя проблема:

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<server>
    <a>true</a>
    <b>false</b>
</server>

test.cpp

sampgdk::logprintf("%d", config.get<bool>("server/a"));
sampgdk::logprintf("%d", config.get<bool>("server/b"));

результат:

1
1

Результат должен быть 1 и 0 правильно? Но я всегда получаю 1 в обоих случаях. Это случается только с Assessment_boolean(). Evaluate_number() и Assessment_string() работают отлично.

Вот мой config.get

template<> bool framework::xml::get(std::string xpath) {
if (is_open) {
    try {
        return pugi::xpath_query(xpath.data()).evaluate_boolean(*ptr);
    }
    catch (std::exception &e) {
        sampgdk::logprintf("XML exception: %s\n", e.what());
    }
}
    return false;
}

person Raefaldhi Amartya    schedule 17.12.2015    source источник
comment
Я ожидаю, что все ставки отключены, поскольку у вас есть недопустимый файл XML.   -  person user253751    schedule 17.12.2015
comment
@immibis Файл XML действителен. Вот мой код, который открывает файл xml: framework::xml config; config.open(test.xml);   -  person Raefaldhi Amartya    schedule 17.12.2015
comment
XML, показанный в вашем вопросе, недействителен. Должен быть один закрывающий тег.   -  person Galik    schedule 17.12.2015
comment
@Galik Не могли бы вы показать мне, что вы имеете в виду? Я немного запутался, вы имеете в виду файл test.xml? что мне делать с этим файлом? На самом деле я новичок в XML. Спасибо   -  person Raefaldhi Amartya    schedule 17.12.2015
comment
@RaefaldhiAmartya XML не может быть просто списком тегов, должен быть один единственный тег, который заключает в себе все остальные теги. Например. <mydata><a>true</a><b>false</b></mydata>. Существует только один тег <mydata />, окружающий все остальные теги.   -  person Galik    schedule 17.12.2015
comment
TBH Я думаю, что это может быть ошибка в pugixml, поскольку я попробовал его с числами и строками нулевой длины с теми же результатами.   -  person Galik    schedule 17.12.2015
comment
@Galik Хорошо, спасибо за помощь, я очень ценю вашу помощь, спасибо!!   -  person Raefaldhi Amartya    schedule 17.12.2015
comment
Вы пробовали first_child().evaluate_boolean(*ptr)   -  person    schedule 17.12.2015
comment
@TruthSerum: на данный момент я этого не сделал, а также Assessment_boolean не является членом first_child (), я пытался прочитать bool из атрибута, и он отлично работает. sampgdk::logprintf(%d,config.ptr›child(server).child(testbool).attribute(bool).as_bool());   -  person Raefaldhi Amartya    schedule 17.12.2015


Ответы (1)


Вы конвертируете строку ("true") в логическое значение, используя XPath. Это возвращает true, если длина строки отлична от нуля.

http://www.w3.org/TR/xpath/#section-Boolean-Functions

Вы можете сравнить строку со значением «true» в выражении XPath, чтобы исправить это, или использовать Assessment_node(*ptr).node().text().as_bool() вместо Assessment_boolean(*ptr).

person zeuxcg    schedule 17.12.2015