Проблемы с анализом XML с использованием крошечного XML в C ++?

Я пытаюсь разобрать следующий xml с помощью крошечного парсера xml. Я пытаюсь получить значение всех атрибутов производителя и потребителя тега q2channel в файле xml. Я использую tinyxml2.

Пока что я написал следующий код, но я застрял здесь, потому что, когда я пытаюсь что-то напечатать, я получаю ноль.

XMLDocument doc;
bool loadOkay=doc.LoadFile( "resources/q2profiling.xml" );XMLElement* titleElement = doc.FirstChildElement()->FirstChildElement();
const char* title = titleElement->GetText();
printf( "The remaining xml is %s\n", title );

Я пробовал несколько различных вариантов кода, чтобы продвинуться в работе, но я застрял здесь. Пожалуйста, помогите мне распечатать значение всех атрибутов потребителя и производителя тега q2channel из xml.

XML-файл приведен ниже

<

?xml version="1.0" encoding="UTF-8" ?>
<q2:profiles xmlns:q2="http://www.example.org/q2profiling" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/q2profiling q2profiling.xsd">
<q2:application name="testAPPlication">
<q2:QDUGraph>
<q2:channel producer="UNKNOWN_PRODUCER(CONSTANT_DATA)" consumer="Out_of_the_main_function_scope">
<q2:UnMA>19298</q2:UnMA>
<q2:Bytes>25892</q2:Bytes>
<q2:UnDV>19298</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134512692" upper="134512695" />
<q2:range lower="134512700" upper="134512703" />
</q2:UnMARanges>
</q2:channel>
<q2:channel producer="UNKNOWN_PRODUCER(CONSTANT_DATA)" consumer="main">
<q2:UnMA>160</q2:UnMA>
<q2:Bytes>234</q2:Bytes>
<q2:UnDV>160</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134513084" upper="134513087" />
<q2:range lower="134513116" upper="134513119" />
<q2:range lower="134513129" upper="134513129" />
</q2:UnMARanges>
</q2:channel>
<q2:channel producer="Out_of_the_main_function_scope" consumer="Out_of_the_main_function_scope">
<q2:UnMA>1474</q2:UnMA>
<q2:Bytes>14815</q2:Bytes>
<q2:UnDV>2468</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520828" upper="134520831" />
<q2:range lower="134520836" upper="134520843" />
<q2:range lower="3077693172" upper="3077693175" />

</q2:UnMARanges>
</q2:channel>
<q2:channel producer="Out_of_the_main_function_scope" consumer="main">
<q2:UnMA>209</q2:UnMA>
<q2:Bytes>381</q2:Bytes>
<q2:UnDV>209</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520836" upper="134520847" />
<q2:range lower="3045611784" upper="3045611795" />

</q2:UnMARanges>
</q2:channel>
<q2:channel producer="main" consumer="Out_of_the_main_function_scope">
<q2:UnMA>40</q2:UnMA>
<q2:Bytes>60</q2:Bytes>
<q2:UnDV>40</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="3048639008" upper="3048639019" />
<q2:range lower="3048639024" upper="3048639031" />

</q2:UnMARanges>
</q2:channel>
<q2:channel producer="main" consumer="main">
<q2:UnMA>32</q2:UnMA>
<q2:Bytes>444</q2:Bytes>
<q2:UnDV>88</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="3048639008" upper="3048639011" />
<q2:range lower="3048639016" upper="3048639019" />

</q2:UnMARanges>
</q2:channel>
<q2:channel producer="UNKNOWN_PRODUCER(CONSTANT_DATA)" consumer="sum">
<q2:UnMA>1</q2:UnMA>
<q2:Bytes>1000</q2:Bytes>
<q2:UnDV>1</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520860" upper="134520860" />
</q2:UnMARanges>
</q2:channel>
<q2:channel producer="UNKNOWN_PRODUCER(CONSTANT_DATA)" consumer="diff">
<q2:UnMA>1</q2:UnMA>
<q2:Bytes>1000</q2:Bytes>
<q2:UnDV>1</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520860" upper="134520860" />
</q2:UnMARanges>
</q2:channel>
<q2:channel producer="init" consumer="sum">
<q2:UnMA>2000</q2:UnMA>
<q2:Bytes>2000</q2:Bytes>
<q2:UnDV>2000</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520896" upper="134521895" />
<q2:range lower="134523968" upper="134524967" />
</q2:UnMARanges>
</q2:channel>
<q2:channel producer="init" consumer="diff">
<q2:UnMA>2000</q2:UnMA>
<q2:Bytes>2000</q2:Bytes>
<q2:UnDV>2000</q2:UnDV>
<q2:UnMARanges>
<q2:range lower="134520896" upper="134521895" />
<q2:range lower="134523968" upper="134524967" />
</q2:UnMARanges>
</q2:channel>
</q2:QDUGraph>
</q2:application>
</q2:profiles>

0

Решение

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

<node>This is text!</node>

даст «Это текст!» как const char* или const std::string& в зависимости от того, как вы компилируете. См. Ссылку API на TiXmlElement.

Если вы хотите запросить само имя узла, используйте TiXmlNode::Value(),

Если вы хотите атрибут, просто используйте Attribute(const char*) или же QueryStringAttribute(...) на элементе. Например, получение и печать следующего документа с предоставленным вами документом

std::cout << doc.FirstChildElement ()->FirstChildElement ()->Attribute ("name") << std::endl;

дает «testAPPlication».

В общем, см. полная документация TinyXML в первую очередь.

РЕДАКТИРОВАТЬ: Следующий пример показывает простым, но безобразным образом, что вам нужно:

TiXmlDocument doc;

if(doc.LoadFile ("test.xml"))
{
TiXmlElement* graphElem   = doc.FirstChildElement()->FirstChildElement ()->FirstChildElement ();
TiXmlElement* channelElem = graphElem->FirstChildElement ();

for(; channelElem; channelElem = channelElem->NextSiblingElement ())
{
std::cout << channelElem->Attribute ("producer")
<< " | "<< channelElem->Attribute ("consumer")
<< std::endl;
}
}

EDIT2: Удален бесконечный цикл и условный.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]