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 элемент.

Другие вопросы по тегам