TinyXML2 C++ - Извлечение определенных данных из старых / плохо отформатированных файлов XML
Я ищу поиск в блоках XML, которые являются довольно старыми (документы от 1999 года), и у меня есть небольшая трудность, чтобы заставить TinyXML2 работать как предназначено. Я могу взять определенные фрагменты, но у меня есть проблемы, когда есть элемент внутри другого. Возьмите этот образец:
<SUBJECT><TITLE>Mathematics</TITLE></SUBJECT>
<AREA><TITLE>Arithmetic</TITLE></AREA>
<SECTION><TITLE>Whole Numbers</TITLE></SECTION>
<TOPIC GRADELEVEL="4"><TITLE>Introduction to Numbers</TITLE></TOPIC>
<DESCRIPTION><TITLE>Description</TITLE></DESCRIPTION>
<FIELDSPACE>
<PARA>To represent each conceivable number by means of a separate
little picture or number symbol is impossible. Therefore the civilizations of
the past all developed a certain pattern whereby they could write down numbers,
by making use of a small number of symbols. </PARA>
</FIELDSPACE>
<FIELDSPACE>
<PARA>Today, we use the Hindu-Arabic system, which first of all is
decimal, because we make use of only 10 different symbols, namely,</PARA>
<LITERALLAYOUT> 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9.</LITERALLAYOUT>
</FIELDSPACE>
<FIELDSPACE>
<PARA>Secondly, a place value applies. This means that if only 1
digit is written down then it is that number, such as a 3, a 6, or an 8.</PARA>
</FIELDSPACE>
<FIELDSPACE>
<PARA>Thirdly, only the addition principle is built into our number
symbols.</PARA>
<PARA>In other words,</PARA>
<LITERALLAYOUT> 135 means 100 + 300 + 5</LITERALLAYOUT>
<LITERALLAYOUT> 6.3 means 6 + three tenths = 6 + <EQUATION>
<INLINEGRAPHIC FILEREF="Mathematics/Arithmetic/WholeNumbers/IntroductionNumbers/eq.png" />
</EQUATION></LITERALLAYOUT>
<LITERALLAYOUT> and two and a quarter = <EQUATION>
<INLINEGRAPHIC FILEREF="Mathematics/Arithmetic/WholeNumbers/IntroductionNumbers/eq2.png" />
</EQUATION></LITERALLAYOUT>
<PARA>means</PARA>
<LITERALLAYOUT> two plus a quarter = <EQUATION>
<INLINEGRAPHIC FILEREF="Mathematics/Arithmetic/WholeNumbers/IntroductionNumbers/eq3.png" />
</EQUATION></LITERALLAYOUT>
</FIELDSPACE>
Вот что я написал:
XMLDocument doc;
Resource::resource_t *f = Resource::Open("IntroductionNumbers.xml"); // File load
if (!f)
return;
doc.Parse((const char*)f->buffer, f->size);
Resource::Close(f);
XMLElement *pElem;
pElem = doc.FirstChildElement();
if (!pElem)
return;
for (pElem = pElem->FirstChildElement(); pElem; pElem = pElem->NextSiblingElement())
{
if (!strcmp(pElem->Value(), "SUBJECT"))
{
// Print what's in pElem->FirstChildElement("TITLE")->GetText()
// This works fine.
}
else if (!strcmp(pElem->Value(), "AREA"))
{
// Print what's in pElem->FirstChildElement("TITLE")->GetText()
// This works fine.
}
...
...
...
else if (!strcmp(pElem->Value(), "TOPIC"))
{
char *temp;
temp = msprintf("%s - Section %s", pElem->FirstChildElement("TITLE")->GetText(), pElem->FirstAttribute()->Value());
// Print what's in temp
// This still works!
}
else if (!strcmp(pElem->Value(), "FIELDSPACE"))
{
// I can print PARA or FIELDSPACE, but I can't seem to read LITERALLAYOUT, EQUATION, or INLINEGRAPHIC.
}
}
Мне нужен код, который является общим, а не код, специфичный для этого решения - существуют сотни файлов XML, и мне нужно написать что-то, что будет анализировать их все. Как мне получить информацию в ЛИТЕРАЛЬНОЙ РАСПРЕДЕЛЕНИИ / УРАВНЕНИИ / ИНЛАЙНГРАФИКЕ?
Заранее спасибо!
2 ответа
Просто чтобы основываться на предыдущем ответе. Это то, что у вас есть:
<LITERALLAYOUT>xxxxxxxxx
<EQUATION>
<INLINEGRAPHIC FILEREF="Mathematics/Arithmetic/WholeNumbers/IntroductionNumbers/eq.png" />
</EQUATION>
</LITERALLAYOUT>
У вас здесь две вещи. Когда вы доберетесь до LITERALLAYOUT
ты можешь использовать GetText
и это вернется xxxxxxxxx
,
Но тогда у тебя есть выбор. Если вы хотите, чтобы он был универсальным, вы должны перебрать все дочерние элементы вашего LITERALLAYOUT
указатель. Если вы не хотите этого делать, вы должны извлечь первого ребенка, например:
XMLElement *pLITERALLAYOUT = xxxx; // You get this pointer.
XMLElement *pEQUATION = pLITERALLAYOUT->FirstChildElement("EQUATION");
if (pEQUATION != nullptr)
{
// Now get the INLINEGRAPHIC element
XMLElement *pINLINEGRAPHIC = pEQUATION->FirstChildElement("INLINEGRAPHIC");
if (pINLINEGRAPHIC != nullptr)
{
const char * FILEREF;
FILEREF = pINLINEGRAPHIC ->Attribute("FILEREF");
}
}
Увидеть? Вы должны знать, как правильно перемещаться по XML-файлу.
EQUATION
здесь нет строкового значения. Он не содержит текста в разметке. Так что вы ничего не получите обратно. Вы должны посмотреть на атрибуты на EQUATION
элемент, например ig->attribute("FILEREF")
, где ig
указатель на структуру, представляющую INLINEGRAPHIC
элемент.