2009-07-09 46 views
6

Tôi đang hỗ trợ ứng dụng C++ cũ sử dụng Xerces-C để phân tích cú pháp XML. Tôi đã bị hư hỏng bởi. Net và sáng sử dụng XPath để chọn các nút từ một cây DOM.Hỗ trợ XPath trong Xerces-C

Có cách nào để truy cập một số chức năng XPath giới hạn trong Xerces-C không? Tôi đang tìm một cái gì đó như selectNodes ("/ cho/bar/baz"). Tôi có thể làm điều này bằng tay, nhưng XPath là tốt đẹp như vậy bằng cách so sánh.

Trả lời

4

Xem faq xerces.

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

Liệu Xerces-C++ XPath hỗ trợ? No.Xerces-C++ 2.8.0 và Xerces-C++ 3.0.1 chỉ thực hiện một phần XPath cho mục đích xử lý ràng buộc nhận dạng lược đồ. Để được hỗ trợ XPath đầy đủ, bạn có thể tham khảo Apache Xalan C++ hoặc các dự án mã nguồn mở khác như Pathan.

Thật dễ dàng để làm những gì bạn muốn bằng xalan.

1

Theo FAQ, Xerces-C hỗ trợ XPath phần 1 thực hiện:

Động cơ tương tự được tạo sẵn qua DOMDocument :: đánh giá API để cho phép người dùng thực hiện đơn giản XPath các truy vấn liên quan đến DOMElement các nút chỉ, không có thử nghiệm biến vị ngữ và chỉ cho phép toán tử "//" làm bước đầu tiên là .

Bạn sử dụng DOMDocument::evaluate() để đánh giá biểu thức, sau đó trả về DOMXPathResult.

+0

Có ai sử dụng chức năng này? Nó có hoạt động không? Nếu có, cho phiên bản nào của Xerces-C? –

+0

@AdamTegen Vâng, tôi biết đó là 6 năm sau nhưng Xerces vẫn còn phổ biến. Tôi đã cung cấp một ví dụ về cách thực hiện đánh giá XPath với Xerces 3.1.2. –

1

Đây là ví dụ làm việc về đánh giá XPath với Xerces 3.1.2.

mẫu XML

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

C++

#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; 
} 

Biên dịch và chạy (giả định xerces tiêu chuẩn cài đặt thư viện và C++ file có tên xpath.cpp)

g++ -g -Wall -pedantic -L/opt/lib -I/opt/include -DMAIN_TEST xpath.cpp -o xpath -lxerces-c 
./xpath 

quả

hello world