使用 TinyXML 解析 XML 元素
Posted
技术标签:
【中文标题】使用 TinyXML 解析 XML 元素【英文标题】:Parsing XML Elements using TinyXML 【发布时间】:2011-09-25 04:06:08 【问题描述】:更新:仍然无法正常工作:(我已经更新了代码部分以反映我目前拥有的内容。
对于使用过 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);
我想取出每张卡片“类型”并将其保存为字符串以放入组合框中。如何访问此属性成员?
【问题讨论】:
【参考方案1】:在玩了很多代码之后,这就是解决方案! (在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;
【讨论】:
【参考方案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
【讨论】:
属性不是 TiXmlHandle 的成员:\ @Jon 让我知道这是否能让你更接近。 我找到了自己的解决方案。见我上面的回答。 你想通了。 :)【参考方案3】:您需要从元素card
中获取属性type
。所以在你的代码中应该是这样的:
const char * attribval = hRoot.FirstChild("card").ToElement()->Attribute("card");
【讨论】:
我试过了,&someCharArray 是 CString tmp;我收到以下错误:'const char *TiXmlElement::Attribute(const char *,int *) const' : cannot convert parameter 2 from 'const char *' to 'int *' 对不起,那是为了获取一个整数值。看看 TinyXML 参考中的函数QueryStringAttribute
,这应该就是你要找的!
我会看看并报告。谢谢 Iceaway。以上是关于使用 TinyXML 解析 XML 元素的主要内容,如果未能解决你的问题,请参考以下文章
windows客户端开发--使用tinyxml库解析xml文件