我在用LibXML。我使用xml文件:
<all>
<material name1= "AS4C" name2="IPS06"/>
<associated name1="IMA_1" name2="IPS05"/>
<associated name1="IMA_2" name2="IPS05"/>
<associated name1="IMA_3" name2="IPS05"/>
<associated name1="AS4C" name2="IPS05"/>
<associated name1="AS3C" name2="IPS05"/>
<material />
<material name1="IMA_1" name2="IPS06"/>
<associated name1="IMA_1" name2="IPS05"/>
<associated name1="AS4C" name2="IPS05"/>
<associated name1="HTA_M" name2="IPS05"/>
<associated name1="IMA_M21E" name2="IPS05"/>
<material />
</all>例如,我试图检查关联的name1="IMA_3“name2="IPS05"/是否存在于material name1= "AS4C”name2="IPS06"/中。但是结果是空的(xmlXPathNodeSetIsEmpty(结果->nodesetval),我认为路径不是真的。
string s_mat1 = "AS4C";
string s_spec1 = "IPS06";
string s_mat2 = "IMA_3";
string s_spec2 = "IPS05";
sPath << "/all/material[@name1=\"" << s_mat1 << "\"][@name2=\"" << s_spec1 << "\"]/associated[@name1=\"" << s_mat2 << "\"][@name2=\"" << s_spec2 << "\"]";
result = xmlXPathEvalExpression((xmlChar *) sPath.str().c_str(), ctxt);
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
cout << "empty" << endl;
}
if (result->type == XPATH_NODESET) {
xmlNodePtr matNode = result->nodesetval->nodeTab[0];
xmlChar *matNode2 = xmlNodeGetContent(matNode);
struct _xmlAttr* matAttr = matNode->properties;
while (matAttr) {
cout << "matAttr :" << string((char *)matAttr->name) << endl;
if (string((char *)matAttr->name)=="name1" && matAttr->children){
string name1= string((char *)matAttr->children->content);
cout << "___ name1==" << name1<< endl;
xmlChar* value = xmlNodeListGetString(matNode->doc, matAttr->children, 1);
cout << "value ==" << string((char *)value) << endl;
}
else if (string((char *)matAttr->name)=="name2"){
string name2= string((char *)matAttr->children->content);
cout << "___ name2==" << name2<< endl;
}
matAttr = matAttr->next;
}
}谢谢。
发布于 2012-11-08 09:57:12
不确定是否有另一个错误(但会更不寻常),但是xml数据不适合您的查询。我想您的xml文件并不是您真正想要的,而是应该是:
<material name1= "AS4C" name2="IPS06">
<associated name1="IMA_1" name2="IPS05"/>
<associated name1="IMA_2" name2="IPS05"/>
<associated name1="IMA_3" name2="IPS05"/>
<associated name1="AS4C" name2="IPS05"/>
<associated name1="AS3C" name2="IPS05"/>
</material>
<material name1="IMA_1" name2="IPS06">
<associated name1="IMA_1" name2="IPS05"/>
<associated name1="AS4C" name2="IPS05"/>
<associated name1="HTA_M" name2="IPS05"/>
<associated name1="IMA_M21E" name2="IPS05"/>
</material>
</all>;注意,在您的示例中,material和associated节点是兄弟节点,但现在associated是material的子节点。
https://stackoverflow.com/questions/13286191
复制相似问题