2

要約すると、私は libxml の完全な初心者であり、既存のソース コードを使用する必要があります。主なアイデアは、最初の xpath 式を適用して、xml ファイルから一連のノードを抽出することです。次に、ノードごとに、2 番目の xpath 式を適用していくつかの値を抽出します。

既存のソース コードは次のとおりです。

int xt_parseXmlResult(xmlDocPtr doc, const char *xpath, assoc_arrayc_t expr, arrayc_t *result)
{
    xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);

    // Register namespaces ...

    /*
     * Evaluate main xpath expression
     */
    xmlXPathObjectPtr xpathNodes = xmlXPathEvalExpression((xmlChar *)xpath, xpathCtx);

    /*
     * Now we apply the xpath expressions on each node returned by the first xpath request
     */
    // First loop is on the XML document as we have to create a new context each
    // time we change the document
    int nbDocs = xpathNodes->nodesetval->nodeNr;

    for (row = 0; row < nbDocs; row++)
    {
        xmlXPathContextPtr  subCtx = xmlXPathNewContext(doc);

        // Register namespaces ...

        // Update context to use the nodeset related to this row
        subCtx->node = xpathNodes->nodesetval->nodeTab[row];

        for (col = 0; col < expr.nbItems; col++)
        {
            // Evaluate expression
            xpathRows = xmlXPathEvalExpression((xmlChar *)expr.itemList[col].val, subCtx);

            result->data[(row + 1) * result->nbCols + col] = strdup((char *)xmlXPathCastToString(xpathRows)); 
            xmlXPathFreeObject(xpathRows);
        }
        xmlXPathFreeContext(subCtx);
        subCtx = NULL;
    }

    xmlFreeDoc(doc); 
    xmlXPathFreeContext(xpathCtx);
    xmlXPathFreeObject(xpathNodes);
    return 0;
}

問題はこの行にあると思います

    // Update context to use the nodeset related to this row
subCtx->node = xpathNodes->nodesetval->nodeTab[row];

2 番目の xpath 式は、各ノードのルートではなく、xml ファイルのルートから適用されるためです。

そのようなことを行う方法について何か考えはありますか?

4

3 に答える 3

1

xpath 式を連結できます。

編集

//FORECAST/DAY/descendant::content/meteo/desc が機能するはずです

于 2009-01-29T17:32:56.353 に答える
1

xmlXPathContext::node に見られるように、内部ライブラリで使用するため、使用できません

おそらくxmlXPtrNewContextが役立つはずですが、私はそれを使用できません。

私は現在、両方の xpath を連結し、全体をクエリすることでトリックを行っています。新しい xpath は、"(" + xpath1 + ")" + "[num]" + xpath2 です。num は、1 から xpath1 結果セットのサイズまでの任意の数値に置き換えることができます。そしてそれはうまくいくようです。

于 2012-02-07T11:01:25.610 に答える
0

いくつかのサンプルコード。ニーズと言語に合わせて変更します。これはC#ですが、ほぼ同じである必要があります。2番目のxpathが「/」で始まっておらず、最初のxpathから返されたノードのインスタンスを使用していることに注意してください。どちらのxpathも「/」で終わりません。

XmlDocument doc = new XmlDocument();
doc.Load(docfile);
XmlNodeList items = doc.SelectNodes("/part1/part2");
foreach (item in items)
{
    XMLNode x = item.SelectNodes("part3");
    //Dostuff
}
于 2009-01-29T19:03:16.467 に答える