【问题标题】:libxml - getting attributeslibxml - 获取属性
【发布时间】:2012-11-08 09:31:04
【问题描述】:

我正在使用 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>

我正在尝试检查 related name1="IMA_3" name2="IPS05"/ 是否存在于 ma​​terial name1="AS4C" name2="IPS06"/强>。但是结果是空的(xmlXPathNodeSetIsEmpty(result->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;
        }
}

谢谢。

【问题讨论】:

  • 您的 XML 中没有任何 materialName 或 specName 属性,而是 name1 和 name2。
  • 抱歉输入错误,我编辑了。

标签: c++ xml libxml2


【解决方案1】:

不确定是否不是另一个错字(但会更不寻常),但您的 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>;

请注意,在您的示例中,materialassociated 节点是兄弟节点,但现在 associatedmaterial 的子节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多