3

xerces-c3.1を使用してXPathを評価する例はあまり見つかりませんでした。

次のサンプルXML入力があるとします。

<abc> 
    <def>AAA BBB CCC</def>
</abc>

XPath "/ abc / def / text()[0]"で "AAABBBCCC"文字列を取得する必要があります。

次のコードが機能します。

XMLPlatformUtils::Initialize();
// create the DOM parser
XercesDOMParser *parser = new XercesDOMParser;
parser->setValidationScheme(XercesDOMParser::Val_Never);
parser->parse("test.xml");
// get the DOM representation
DOMDocument *doc = parser->getDocument();
// get the root element
DOMElement* root = doc->getDocumentElement();

// evaluate the xpath
DOMXPathResult* result=doc->evaluate(
    XMLString::transcode("/abc/def"), // "/abc/def/text()[0]"
    root,
    NULL,
    DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, //DOMXPathResult::ANY_UNORDERED_NODE_TYPE, //DOMXPathResult::STRING_TYPE,
    NULL);

// look into the xpart evaluate result
result->snapshotItem(0);
std::cout<<StrX(result->getNodeValue()->getFirstChild()->getNodeValue())<<std::endl;;

XMLPlatformUtils::Terminate();
return 0;

しかし、私は本当にそれが嫌いです:

result->getNodeValue()->getFirstChild()->getNodeValue()

私が望む正確なノードではなく、ノードセットにする必要がありますか?

「/abc/ def / text()[0]」や「DOMXPathResult ::STRING_TYPE」など、他の形式のXPathを試しました。xercesは常に例外をスローしました。

私は何を間違えましたか?

4

1 に答える 1

4

私は Xerces C++ でコーディングしていませんが、W3C DOM レベル 3 を実装しているようです。それに基づいて、次のようなパスを持つ要素ノードを選択し、/abc/def単にアクセスresult->getNodeValue()->getTextContent()して要素の内容を取得することをお勧めします (例: AAA BBB CCC)。

私がDOM APIを理解している限り、文字列値が必要な場合は、次のようなパスを使用する必要があり、そうする必要がありstring(/abc/def)ますresult->getStringValue()(evaluateメソッドが任意のタイプまたはSTRING_TYPEを結果タイプとして要求する場合)。

ドキュメントの順序で最初のノードのみに関心があることがわかっている場合は、他の方法で評価/abc/defFIRST_ORDERED_NODE_TYPEてアクセスできますresult->getNodeValue()->getTextContent()

于 2013-01-07T18:08:46.293 に答える