2011-01-14 17 views
16

tôi biết làm thế nào để tạo ra một dom hoàn chỉnh từ một file xml chỉ sử dụng XercesDOMParser:Làm Xerces phân tích một chuỗi thay vì một tập tin

xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(path_to_my_file); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

Vâng, đó là hoạt động ... nhưng những gì nếu tôi muốn phân tích một chuỗi? Một cái gì đó như

std::string myxml = "<root>...</root>"; 
xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(myxml); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

Tôi đang sử dụng phiên bản 3. Nhìn bên trong AbstractDOMParser tôi thấy rằng phương pháp phân tích cú pháp và các phiên bản quá tải của nó, chỉ phân tích tập tin.

Làm cách nào để phân tích cú pháp từ chuỗi?

Trả lời

18

Tạo một MemBufInputSourceparse rằng:

xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(), 
            "myxml (in memory)"); 
parser->parse(myxml_buf); 
+1

Xin lỗi tôi không hiểu các tham số cuối cùng ... nó là gì ?? ?? – Andry

+4

Đó là "id hệ thống giả" được sử dụng trong thông báo lỗi và "bất kỳ thực thể nào được giới thiệu từ thực thể này thông qua đường dẫn/URL tương đối sẽ liên quan đến id hệ thống giả này". Xem tài liệu API. –

+1

larsmans bạn có thể vui lòng cho tôi biết lý do tại sao, khi sử dụng mã của bạn và in đúng xml, khi tôi gọi Terminate() ứng dụng của tôi đi vào phân đoạn lỗi ????? – Andry

11

Sử dụng quá tải sau XercesDOMParser :: parse():

void XercesDOMParser::parse(const InputSource& source); 

đi qua nó một MemBufInputSource:

MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false); 
parser->parse(src); 
+1

Làm thế nào tôi có thể tìm ra những gì không gian tên MemBufInputSource và Wrapper4InputSource đang ở trong? Tôi gặp sự cố nghiêm trọng với không gian tên trong xerces. Ty – Silver

+2

Đó là trên không gian tên 'xercesc', nhưng bạn cũng cần' #include '. Tôi trễ hai năm, nhưng tôi đã có cùng một vấn đề và một người khác có thể có nó lại sau. – VillasV

+0

Cũng +1 để chỉ định dàn diễn viên cần thiết. – VillasV

1

Im làm theo cách khác. Nếu điều này không chính xác, vui lòng cho tôi biết lý do. Dường như nó hoạt động. Đây là những gì phân tích cú pháp dự đoán:

DOMDocument* DOMLSParser::parse(const DOMLSInput * source) 

Vì vậy, bạn cần phải đặt trong một DOMLSInput thay vì một một InputSource:

xercesc::DOMImplementation * impl = xercesc::DOMImplementation::getImplementation(); 
xercesc::DOMLSParser *parser = (xercesc::DOMImplementationLS*)impl)->createLSParser(xercesc::DOMImplementation::MODE_SYNCHRONOUS, 0); 
xercesc::DOMDocument *doc; 

xercesc::Wrapper4InputSource source (new xercesc::MemBufInputSource((const XMLByte *) (myxml.c_str()), myxml.size(), "A name"); 
parser->parse(&source); 
+0

Cảm ơn bạn đã gợi ý điều này. Câu trả lời này dường như gần hơn với [Hướng dẫn lập trình DOM thực tế] (https://xerces.apache.org/xerces-c/program-dom-3.html) – user23573

Các vấn đề liên quan