更新:仍然无效:(我已更新代码部分以反映我目前的情况。
对于使用过TinyXML的人来说,这应该是一个非常简单的问题。我正在尝试使用TinyXML来解析XML文档并提取一些值。我想出了如何在昨天添加到库中,并且我已经成功加载了文档(嘿,这是一个开始)。
我一直在阅读手册,我无法弄清楚如何提取个别属性。谷歌搜索后,我还没有找到我的具体例子的例子,所以也许这里使用过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”并将其保存为字符串以放入组合框中。如何访问此属性成员?
答案 0 :(得分:8)
经过大量的代码游戏,这是解决方案! (在HERE)的帮助下
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;
}
答案 1 :(得分:2)
应该有一个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
答案 2 :(得分:1)
您需要从元素type
获取属性card
。所以在你的代码中应该是这样的:
const char * attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");