Разбор XML-элементов с помощью TinyXML

ОБНОВЛЕНИЕ: по-прежнему не работает :( Я обновил часть кода, чтобы отразить то, что у меня сейчас есть.

Это должен быть довольно простой вопрос для людей, которые использовали TinyXML. Я пытаюсь использовать TinyXML для анализа XML-документа и извлечения некоторых значений. Вчера я понял, как добавить в библиотеку, и я успешно загрузил документ (эй, это начало).

Я читал руководство и не могу понять, как вытащить отдельные атрибуты. После поиска в Google я не нашел примера моего конкретного примера, поэтому, возможно, кто-то из тех, кто использовал TinyXML, может помочь. Ниже приведен фрагмент XML и место, где я начал его анализировать.

XML:

<EGCs xmlns="http://tempuri.org/XMLSchema.xsd">
  <card type="EGC1">
    <offsets>
      [ ... ]
    </offsets>
  </card>

   <card type="EGC2">
    <offsets>
      [ ... ]
    </offsets>
  </card>
</EGCs>

Загрузка/анализ кода:

TiXmlDocument doc("EGC_Cards.xml");
if(doc.LoadFile())
{
    TiXmlHandle hDoc(&doc);
    TiXmlElement* pElem;
    TiXmlHandle hRoot(0);
    pElem = hDoc.FirstChildElement().Element();
    if (!pElem) return false;
    hRoot = TiXmlHandle(pElem);

    //const char *attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");
    pElem = hDoc.FirstChild("EGCs").Child("card", 1).ToElement();
    if(pElem)
    {
        const char* tmp = pElem->GetText();
        CComboBox *combo = (CComboBox*)GetDlgItem(IDC_EGC_CARD_TYPE);
        combo->AddString(tmp);
    }
}

Я хочу извлечь каждую карточку "тип" и сохранить ее в виде строки, чтобы поместить в поле со списком. Как получить доступ к этому члену атрибута?


person Jon    schedule 29.06.2011    source источник


Ответы (3)


После долгих экспериментов с кодом, вот решение! (С помощью ЗДЕСЬ)

TiXmlDocument doc("EGC_Cards.xml");
combo = (CComboBox*)GetDlgItem(IDC_EGC_CARD_TYPE);

if(doc.LoadFile())
{
    TiXmlHandle hDoc(&doc);
    TiXmlElement *pRoot, *pParm;
    pRoot = doc.FirstChildElement("EGCs");
    if(pRoot)
    {
        pParm = pRoot->FirstChildElement("card");
        int i = 0; // for sorting the entries
        while(pParm)
        {
            combo->InsertString(i, pParm->Attribute("type"));
            pParm = pParm->NextSiblingElement("card");
            i++;
        }
    }
}
else 
{
    AfxMessageBox("Could not load XML File.");
    return false;
}
person Jon    schedule 29.06.2011

должен быть метод Attribute, который принимает имя атрибута в качестве параметра, см.: http://www.grinninglizard.com/tinyxmldocs/classTiXmlElement.html

из документации я вижу, что код будет выглядеть так:

    hRoot.FirstChildElement("card").ToElement()->Attibute("type");

Однако для того, что вы делаете, я бы использовал XPATH, если это вообще возможно. Я никогда не использовал его, но проект TinyXPath может быть полезен, если вы решите пойти по этому пути, ссылка: http://tinyxpath.sourceforge.net/

Надеюсь это поможет.

Документация, которую я использую, чтобы помочь вам, находится по адресу: http://www.grinninglizard.com/tinyxmldocs/hierarchy.html

person Rob    schedule 29.06.2011
comment
Атрибут не является членом TiXmlHandle :\ - person Jon; 29.06.2011
comment
@Jon Дай мне знать, если это сблизит тебя. - person Rob; 29.06.2011
comment
Я нашел свое собственное решение. Смотрите мой ответ выше. - person Jon; 30.06.2011
comment
Галя, что ты разобрался. :) - person Rob; 07.07.2011

Вам нужно получить атрибут type из элемента card. Итак, в вашем коде должно быть что-то вроде:

const char * attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");
person iceaway    schedule 29.06.2011
comment
Я пробовал это, где &someCharArray - это CString tmp; Я получаю следующую ошибку: 'const char *TiXmlElement::Attribute(const char *,int *) const': невозможно преобразовать параметр 2 из 'const char *' в 'int *' - person Jon; 29.06.2011
comment
Извините, это было для получения целочисленного значения. Взгляните на функцию QueryStringAttribute, которая находится в справочнике TinyXML, это должно быть то, что вы ищете! - person iceaway; 29.06.2011
comment
Я посмотрю и отчитаюсь. Спасибо Iceaway. - person Jon; 29.06.2011