Синтаксический анализ XML-элементов с помощью TinyXML
UPDATE: Все еще не работает : (я обновил часть кода, чтобы отразить то, что у меня есть в настоящее время.
Это должен быть довольно простой вопрос для людей, которые использовали TinyXML. Я пытаюсь использовать TinyXML для анализа XML-документа и извлечения некоторых значений. Вчера я понял, как добавить в библиотеку, и я успешно загрузил документ (Эй, это начало).
Я читал руководство, и я не могу понять, как вытащить отдельные атрибуты. После Googling вокруг, я не нашел пример моего конкретного примера, так что, возможно, кто-то здесь, кто использовал 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);
}
}
Я хочу вытащить каждую карту "type" и сохранить ее в строку, чтобы поместить в combobox. Как получить доступ к этому член атрибута?
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;
}
должен быть метод атрибута, который принимает и имя атрибута в качестве параметра см.: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
что вам нужно, чтобы получить атрибут type
с элементом card
. Поэтому в вашем коде это должно быть что-то вроде:
const char * attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");