2009-07-09 10 views
6

में XPath समर्थन मैं एक विरासत सी ++ एप्लिकेशन का समर्थन कर रहा हूं जो एक्सएमएल पार्सिंग के लिए जेरिस-सी का उपयोग करता है। मैं नेट द्वारा खराब हो गया हूं और डीओएम पेड़ से नोड्स का चयन करने के लिए XPath का उपयोग करने के लिए उपयोग किया जाता है।Xerces-C

क्या Xerces-C में कुछ सीमित XPath कार्यक्षमता प्राप्त करने का कोई तरीका है? मैं selectNodes ("/ for/bar/baz") जैसे कुछ ढूंढ रहा हूं। मैं इसे मैन्युअल रूप से कर सकता था, लेकिन तुलना में XPath बहुत अच्छा है।

उत्तर

4

xerces faq देखें।

http://xerces.apache.org/xerces-c/faq-other-2.html#faq-9

Xerces-सी ++ समर्थन XPath करता है? नं। एक्ससेस-सी ++ 2.8.0 और जेर्सेस-सी ++ 3.0.1 केवल स्कीमा पहचान बाधाओं को संभालने के प्रयोजनों के लिए आंशिक XPath कार्यान्वयन है। पूर्ण XPath समर्थन के लिए, आप अपाचे ज़लान सी ++ या पठान जैसे अन्य ओपन सोर्स प्रोजेक्ट्स का उल्लेख कर सकते हैं।

हालांकि xalan का उपयोग करना चाहते हैं, यह करना काफी आसान है।

1

FAQ के अनुसार, Xerces-सी आंशिक XPath 1 कार्यान्वयन का समर्थन करता:

ही इंजन DOMDocument के माध्यम से उपलब्ध किया जाता है :: उपयोगकर्ता सरल XPath DOMElement से जुड़े प्रश्न करने होंगे जाने के लिए मूल्यांकन एपीआई नोड्स केवल, बिना किसी अनुमानित परीक्षण और "//" ऑपरेटर को केवल प्रारंभिक चरण के रूप में अनुमति देता है।

आप DOMDocument::evaluate() का उपयोग अभिव्यक्ति है, जो तब एक DOMXPathResult रिटर्न का मूल्यांकन करने के।

+0

किसी को भी इस कार्यक्षमता का उपयोग किया गया है? क्या यह काम करता है? यदि हां, तो Xerces-C के किस संस्करण के लिए? –

+0

@AdamTegen हाँ, मुझे पता है कि यह 6 साल बाद है लेकिन जेरिस अभी भी लोकप्रिय है। मैंने Xerces 3.1.2 के साथ XPath मूल्यांकन को पूरा करने का एक उदाहरण प्रदान किया। –

1

यहां Xerces 3.1.2 के साथ XPath मूल्यांकन का एक कामकाजी उदाहरण है।

नमूना XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <ApplicationSettings>hello world</ApplicationSettings> 
</root> 

सी ++

#include <iostream> 
#include <xercesc/dom/DOM.hpp> 
#include <xercesc/dom/DOMDocument.hpp> 
#include <xercesc/dom/DOMElement.hpp> 
#include <xercesc/util/TransService.hpp> 
#include <xercesc/parsers/XercesDOMParser.hpp> 

using namespace xercesc; 
using namespace std; 

int main() 
{ 
    XMLPlatformUtils::Initialize(); 
    // create the DOM parser 
    XercesDOMParser *parser = new XercesDOMParser; 
    parser->setValidationScheme(XercesDOMParser::Val_Never); 
    parser->parse("sample.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("/root/ApplicationSettings"), 
     root, 
     NULL, 
     DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, 
     NULL); 

    if (result->getNodeValue() == NULL) 
    { 
    cout << "There is no result for the provided XPath " << endl; 
    } 
    else 
    { 
    cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl; 
    } 

    XMLPlatformUtils::Terminate(); 
    return 0; 
} 

संकलित करें और चलाने के

(मानक xerces पुस्तकालय स्थापना और सी ++ फ़ाइल का नाम xpath.cpp मान लिया गया है)

परिणाम

hello world