1

現在、C++ プロジェクトを libxml2 から pugixml に移植しています。私はlibxml2で完全にうまく機能していたXPathクエリを持っていますが、pugixmlではゼロノードを返します:

"//*[local-name(.) = '" + name + "']"

どこでname取得したい要素の名前です。何が起こっているのか誰にも光を当てることができますか?

コード:

const string path = "//*[local-name(.) = '" + name + "']";
std::cerr << path << std::endl;
try {
   const xpath_node_set nodes = this->doc.select_nodes(path.c_str());
   return nodes;
} catch(const xpath_exception& e) {
   std::cerr << e.what() << std::endl;
   throw logic_error("Could not select elements from document.");
}

名前: 「ページ」

XML:

<MyDocument>
  <Pages>
    <Page>
      <Para>
        <Word>Some</Word>
        <Word>People</Word>
      </Para>
    </Page>
    <Page>
      <Para>
        <Word>Some</Word>
        <Word>Other</Word>
        <Word>People</Word>
      </Para>
    </Page>
  </Pages>
</MyDocument>
4

1 に答える 1

1

このプログラムは私のために働きます。最新バージョンのpugixmlを使用していますか?

または、pugixml が名前空間に適していないことに気付きました。検索しているノード名でそれらを指定する必要がある場合があります。

確認したところ、名前空間で正常に動作します。

#include <pugixml.hpp>

#include <iostream>

const char* xml =
"<MyDocument>"
"  <Pages>"
"    <Page>"
"      <Para>"
"        <Word>Some</Word>"
"        <Word>People</Word>"
"      </Para>"
"    </Page>"
"    <Page>"
"      <Para>"
"        <Word>Some</Word>"
"        <Word>Other</Word>"
"        <Word>People</Word>"
"      </Para>"
"    </Page>"
"  </Pages>"
"</MyDocument>";

int main()
{
    std::string name = "Para";

    const std::string path = "//*[local-name(.) = '" + name + "']";

    pugi::xml_parse_result result;

    pugi::xml_document doc;

    doc.load(xml);

    const pugi::xpath_node_set nodes = doc.select_nodes(path.c_str());

    for(auto& node: nodes)
    {
        std::cout << node.node().name() << '\n';
    }
}

出力

Para
Para
于 2014-07-30T11:37:21.620 に答える