Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
xerces_dom [2008/04/14 23:59] kmioduszewski |
xerces_dom [2008/04/15 10:19] kmioduszewski |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== biblioteka dla XML: Xerces (DOM) ===== | ====== biblioteka dla XML: Xerces (DOM) ===== | ||
- | --- //[[kmioduszewski@polibuda.info|Krzysztof Mioduszewski]] 2008/04/14 23:59// | + | **Autor:** //[[kmioduszewski@polibuda.info|Krzysztof Mioduszewski]] 2008/04/14 23:59//\\ \\ |
Xerces-C++ DOM jest częścią Xerces-C++ API zaprojektowanego do współpracy z plikami w formacie XML. API umożliwia parsowania, manipulowanie, walidowanie oraz generowanie poprawnych dokumentów. | Xerces-C++ DOM jest częścią Xerces-C++ API zaprojektowanego do współpracy z plikami w formacie XML. API umożliwia parsowania, manipulowanie, walidowanie oraz generowanie poprawnych dokumentów. | ||
- | \\ | + | \\ \\ |
Biblioteka DOM jest implementacją następujących rekomendacji W3C: | Biblioteka DOM jest implementacją następujących rekomendacji W3C: | ||
* [[http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/|Document Object Model (DOM) Level 1 Specification]] | * [[http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/|Document Object Model (DOM) Level 1 Specification]] | ||
Linia 139: | Linia 139: | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
Linia 148: | Linia 160: | ||
===== DOMDocument, operacje na dokumencie===== | ===== DOMDocument, operacje na dokumencie===== | ||
- | Gdy dokument zostanie sparsowany bez żadnych błędów możemy swobodnie zacząć na nim pracować wykorzystując zawarte w rekomendacjach metody. Poniżej kod zawierający przykładowe operacje: | + | Gdy dokument zostanie sparsowany bez żadnych błędów możemy swobodnie zacząć na nim pracować wykorzystując zawarte w rekomendacjach metody. Poniżje znajduje się kod przykładowej aplikacji, która wczytuje plik XML, wpisuje jego zawartość na ekran, modyfikuje go, a następnie zapisuje zmiany do pliku.\\ \\ |
+ | Plik XML - ''notes.xml'', który zostanie wczytany: | ||
+ | <code xml> | ||
+ | <?xml version="1.0"?> | ||
+ | <!DOCTYPE notes SYSTEM "note.dtd"> | ||
+ | <notes owner="John Doe"> | ||
+ | <note date="21/02/2008"> | ||
+ | <from>Jani</from> | ||
+ | <heading>Reminder</heading> | ||
+ | <body>Don't forget me this weekend</body> | ||
+ | </note> | ||
+ | <note date="12/04/2008"> | ||
+ | <from>Jeff</from> | ||
+ | <heading>Money</heading> | ||
+ | <body>Gimme my money back!</body> | ||
+ | </note> | ||
+ | </notes> | ||
+ | </code> | ||
+ | DTD - ''notes.dtd'' | ||
+ | <code> | ||
+ | <!ELEMENT notes (note+) > | ||
+ | <!ATTLIST notes owner CDATA #REQUIRED> | ||
+ | <!ELEMENT note (from,heading,body)> | ||
+ | <!ATTLIST note date CDATA #REQUIRED> | ||
+ | <!ELEMENT from (#PCDATA)> | ||
+ | <!ELEMENT heading (#PCDATA)> | ||
+ | <!ELEMENT body (#PCDATA)> | ||
+ | </code> | ||
+ | Klasy pomocnicze ''support.h'': | ||
+ | <code cpp> | ||
+ | #include <string> | ||
+ | #include <iostream> | ||
+ | #include <xercesc/util/XMLString.hpp> | ||
+ | #include <xercesc/sax/HandlerBase.hpp> | ||
+ | |||
+ | //klasa pomocnicza ułatwiająca współpracę z XMLCh* | ||
+ | class UniString { | ||
+ | private : | ||
+ | char* cString; | ||
+ | XMLCh* xmlString; | ||
+ | |||
+ | public : | ||
+ | UniString(const XMLCh* const str) | ||
+ | : | ||
+ | cString(xercesc::XMLString::transcode(str)), | ||
+ | xmlString(xercesc::XMLString::replicate(str)) | ||
+ | {} | ||
+ | |||
+ | UniString(const char* const str) | ||
+ | : | ||
+ | cString(xercesc::XMLString::replicate(str)), | ||
+ | xmlString(xercesc::XMLString::transcode(str)) | ||
+ | {} | ||
+ | |||
+ | UniString(const std::string& str) | ||
+ | : | ||
+ | cString(xercesc::XMLString::replicate(str.c_str())), | ||
+ | xmlString(xercesc::XMLString::transcode(str.c_str())) | ||
+ | {} | ||
+ | |||
+ | ~UniString() | ||
+ | { | ||
+ | xercesc::XMLString::release(&cString); | ||
+ | xercesc::XMLString::release(&xmlString); | ||
+ | } | ||
+ | |||
+ | const char* toCString() { return cString; } | ||
+ | const XMLCh* toXMLString() { return xmlString; } | ||
+ | |||
+ | std::ostream& print(std::ostream& s) const | ||
+ | { | ||
+ | s << cString; | ||
+ | return(s); | ||
+ | } | ||
+ | |||
+ | }; | ||
+ | |||
+ | std::ostream& operator<<( std::ostream& s, const UniString& str ) { return str.print(s); } | ||
+ | |||
+ | //klasa pomocnicza przechowująca nazwy tagów oraz atrybutów | ||
+ | class docNames { | ||
+ | public: | ||
+ | const UniString TAG_NOTES; | ||
+ | const UniString TAG_NOTE; | ||
+ | const UniString TAG_FROM; | ||
+ | const UniString TAG_HEADING; | ||
+ | const UniString TAG_BODY; | ||
+ | |||
+ | const UniString ATTR_OWNER; | ||
+ | const UniString ATTR_DATE; | ||
+ | |||
+ | docNames() | ||
+ | : | ||
+ | TAG_NOTES("notes"), | ||
+ | TAG_NOTE("note"), | ||
+ | TAG_FROM("from"), | ||
+ | TAG_HEADING("heading"), | ||
+ | TAG_BODY("body"), | ||
+ | |||
+ | ATTR_OWNER("owner"), | ||
+ | ATTR_DATE("date") | ||
+ | {} | ||
+ | }; | ||
+ | |||
+ | class myErrorHandler : xercesc::HandlerBase { | ||
+ | void warning( const xercesc::SAXParseException& e ) { | ||
+ | std::cout << "warning: " << UniString(e.getMessage()) | ||
+ | << " | line: " << e.getLineNumber() << std::endl; | ||
+ | } | ||
+ | void error( const xercesc::SAXParseException& e ) { | ||
+ | std::cout << "error: " << UniString(e.getMessage()) | ||
+ | << " | line: " << e.getLineNumber() << std::endl; | ||
+ | } | ||
+ | void fatalError( const xercesc::SAXParseException& e ) { | ||
+ | std::cout << "fatalError: " << UniString(e.getMessage()) | ||
+ | << " | line: " <<e.getLineNumber() << std::endl; | ||
+ | } | ||
+ | void resetErrors() {} | ||
+ | }; | ||
+ | </code> | ||
+ | ''parser.cpp'' FIXME | ||
+ | <code cpp> | ||
+ | #include "support.h" | ||
+ | |||
+ | xercesc::DOMDocument* parseXML() { | ||
+ | xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser(); | ||
+ | parser->setValidationScheme(xercesc::XercesDOMParser::Val_Auto); | ||
+ | parser->setDoNamespaces(true); | ||
+ | |||
+ | xercesc::ErrorHandler* errHandler = (xercesc::ErrorHandler*) new myErrorHandler(); | ||
+ | parser->setErrorHandler(errHandler); | ||
+ | |||
+ | UniString src = UniString("file.xml"); | ||
+ | try { | ||
+ | parser->parse(src.toXMLString()); | ||
+ | } | ||
+ | catch (...) { | ||
+ | //... | ||
+ | } | ||
+ | |||
+ | if(parser->getErrorCount()==0) { | ||
+ | return parser->getDocument(); | ||
+ | } else { | ||
+ | return NULL; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | try { | ||
+ | xercesc::XMLPlatformUtils::Initialize(); | ||
+ | } | ||
+ | catch (const xercesc::XMLException& e) { | ||
+ | std::cerr << UniString(e.getMessage()) << std::endl; | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | xercesc::DOMDocument* xmlDoc = parseXML(); | ||
+ | if(xmlDoc == NULL) | ||
+ | return -1; | ||
+ | |||
+ | |||
+ | xercesc::XMLPlatformUtils::Terminate(); | ||
+ | |||
+ | int a; | ||
+ | std::cin >> a; | ||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
<code cpp> | <code cpp> | ||
//... | //... |