arabica/examples/XPath/xgrep.cpp

86 lines
2 KiB
C++
Raw Normal View History

2005-08-09 12:30:42 +02:00
// DOMWriter.cpp : Defines the entry point for the application.
//
#ifdef _MSC_VER
#pragma warning(disable: 4786 4250 4503)
#endif
#include <string>
#include <SAX/helpers/CatchErrorHandler.h>
#include <DOM/SAX2DOM/SAX2DOM.h>
2005-11-09 22:13:22 +01:00
#include <DOM/Utils/Stream.h>
2005-08-09 12:30:42 +02:00
#include <XPath/XPath.hpp>
////////////////////////////////////////////////
int main(int argc, char* argv[])
{
if(argc < 3)
{
std::cout << "Usage : " << argv[0] << " xpath xmlfile ... " << std::endl;
return 0;
} // if(argc < 3)
2005-08-09 12:30:42 +02:00
2005-08-16 22:59:04 +02:00
Arabica::XPath::XPath<std::string> xpathParser;
2006-07-14 12:09:14 +02:00
Arabica::XPath::XPathExpressionPtr<std::string> xpath;
try {
//xpath = xpathParser.compile(argv[1]);
xpath = xpathParser.compile_expr(argv[1]);
}
catch(const std::runtime_error& error) {
std::cout << "XPath compilation error: " << error.what() << std::endl;
return 0;
}
2005-08-09 12:30:42 +02:00
SAX2DOM::Parser<std::string> domParser;
SAX::CatchErrorHandler<std::string> eh;
domParser.setErrorHandler(eh);
for(int i = 2; i < argc; ++i)
{
std::string file(argv[i]);
SAX::InputSource is;
is.setSystemId(file);
if(file != "-")
domParser.parse(is);
else
{
is.setSystemId("stdin");
is.setByteStream(std::cin);
domParser.parse(is);
} // if(file != "-")
if(!eh.errorsReported())
{
DOM::Document<std::string> doc = domParser.getDocument();
2006-08-04 11:53:06 +02:00
// doc.normalize();
2005-11-09 22:13:22 +01:00
Arabica::XPath::XPathValuePtr<std::string> result;
result = xpath->evaluate(doc);
2005-08-09 12:30:42 +02:00
if(result->asBool())
2005-11-09 22:13:22 +01:00
{
2005-08-09 12:30:42 +02:00
std::cout << file << std::endl;
2005-11-09 22:13:22 +01:00
if(result->type() == Arabica::XPath::NODE_SET)
{
const Arabica::XPath::NodeSet<std::string>& ns = result->asNodeSet();
for(unsigned int i = 0; i < ns.size(); ++i)
{
2006-08-04 11:53:06 +02:00
DOM::Node<std::string> n = ns[i];
2005-11-09 22:13:22 +01:00
std::cout << n << std::endl;
}
} // if ..
} // if ...
2005-08-09 12:30:42 +02:00
}
else
{
std::cerr << eh.errors() << std::endl;
eh.reset();
} // if ...
} // for ...
return 0;
} // main
// end of file