blob: 97c15a12662b0123eb0a3ef6271c195f9f7f420f [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <xalanc/Include/PlatformDefinitions.hpp>
#include <cassert>
#if defined(XALAN_CLASSIC_IOSTREAMS)
#include <iostream.h>
#else
#include <iostream>
#endif
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xalanc/XalanDOM/XalanDocument.hpp>
#include <xalanc/XalanDOM/XalanElement.hpp>
#include <xalanc/PlatformSupport/XalanOutputStreamPrintWriter.hpp>
#include <xalanc/PlatformSupport/XalanStdOutputStream.hpp>
#include <xalanc/XPath/NodeRefList.hpp>
#include <xalanc/XPath/XObject.hpp>
#include <xalanc/XPath/XPathEvaluator.hpp>
#include <xalanc/XMLSupport/FormatterToXML.hpp>
#include <xalanc/XMLSupport/FormatterTreeWalker.hpp>
#include <xalanc/XMLSupport/XMLSupportInit.hpp>
#include <xalanc/XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
#include <xalanc/XalanSourceTree/XalanSourceTreeInit.hpp>
#include <xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
int
main(
int argc,
char* argv[])
{
XALAN_USING_STD(cerr)
XALAN_USING_STD(cout)
XALAN_USING_STD(endl)
int theResult = 0;
if (argc != 4)
{
cerr << "Usage: SerializeNodeSet XMLFilePath Context XPathExpression" << endl;
theResult = -1;
}
else
{
try
{
XALAN_USING_XERCES(XMLPlatformUtils)
XALAN_USING_XALAN(XPathEvaluator)
XMLPlatformUtils::Initialize();
XPathEvaluator::initialize();
{
XALAN_USING_XERCES(LocalFileInputSource)
XALAN_USING_XALAN(NodeRefList)
XALAN_USING_XALAN(XalanDocument)
XALAN_USING_XALAN(XalanDOMString)
XALAN_USING_XALAN(XalanNode)
XALAN_USING_XALAN(XalanSourceTreeInit)
XALAN_USING_XALAN(XMLSupportInit)
XALAN_USING_XALAN(XalanSourceTreeDOMSupport)
XALAN_USING_XALAN(XalanSourceTreeParserLiaison)
// Initialize the XalanSourceTree subsystem...
XalanSourceTreeInit theSourceTreeInit;
// Initialize the XMLSupport subsystem...
XMLSupportInit theXMLSupportInit;
// We'll use these to parse the XML file.
XalanSourceTreeDOMSupport theDOMSupport;
XalanSourceTreeParserLiaison theLiaison(theDOMSupport);
// Hook the two together...
theDOMSupport.setParserLiaison(&theLiaison);
const XalanDOMString theFileName(argv[1]);
// Create an input source that represents a local file...
const LocalFileInputSource theInputSource(theFileName.c_str());
// Parse the document...
XalanDocument* const theDocument =
theLiaison.parseXMLStream(theInputSource);
assert(theDocument != 0);
XPathEvaluator theEvaluator;
// OK, let's find the context node...
XalanNode* const theContextNode =
theEvaluator.selectSingleNode(
theDOMSupport,
theDocument,
XalanDOMString(argv[2]).c_str(),
theDocument->getDocumentElement());
if (theContextNode == 0)
{
cerr << "Error: No nodes matched the location path \""
<< argv[2]
<< "\"."
<< endl
<< "Execution cannot continue."
<< endl
<< endl;
}
else
{
// OK, let's evaluate the expression...
const NodeRefList theResult =
theEvaluator.selectNodeList(
theDOMSupport,
theContextNode,
XalanDOMString(argv[3]).c_str(),
theDocument->getDocumentElement());
const NodeRefList::size_type theLength = theResult.getLength();
if (theLength == 0)
{
cerr << endl
<< "Warning: No nodes matched the location path \""
<< argv[3]
<< "\"."
<< endl
<< endl;
}
else
{
XALAN_USING_XALAN(XalanStdOutputStream)
XALAN_USING_XALAN(XalanOutputStreamPrintWriter)
XALAN_USING_XALAN(FormatterToXML)
XALAN_USING_XALAN(FormatterTreeWalker)
// OK, we're going to serialize the nodes that were
// found. We should really check to make sure the
// root (document) has not been selected, since we
// really can't serialize a node list with the root.
XalanStdOutputStream theStream(cout);
XalanOutputStreamPrintWriter thePrintWriter(theStream);
FormatterToXML theFormatter(thePrintWriter);
FormatterTreeWalker theWalker(theFormatter);
// Don't write a header...
theFormatter.setShouldWriteXMLHeader(false);
// It's required that we do this...
theFormatter.startDocument();
// Traverse the subtree of the document rooted at
// each node we've selected...
for (NodeRefList::size_type i = 0; i < theLength; ++i)
{
const XalanNode* const theNode = theResult.item(i);
assert(theNode != 0);
const XalanNode::NodeType theNodeType =
theNode->getNodeType();
if (theNodeType == XalanNode::DOCUMENT_NODE)
{
cerr << endl
<< "Warning: The root was selected. The root cannot be serialized."
<< endl;
}
else if (theNodeType == XalanNode::ATTRIBUTE_NODE)
{
cerr << endl
<< "Warning: An attribute or namespace node was selected. Attribute and namespace nodes cannot be serialized."
<< endl;
}
else
{
theWalker.traverseSubtree(theNode);
}
}
// It's required that we do this...
theFormatter.endDocument();
}
}
}
XPathEvaluator::terminate();
XMLPlatformUtils::Terminate();
}
catch(...)
{
cerr << "Exception caught!" << endl;
theResult = -1;
}
}
return theResult;
}