ITK  6.0.0
Insight Toolkit
Examples/IO/XML/DOMFindDemo.cxx
/*=========================================================================
*
* Copyright NumFOCUS
*
* 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
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* 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.
*
*=========================================================================*/
/*
* This interactive example program demonstrates:
* - how to read a DOM object from an XML file;
* - how to write a DOM object to an XML file; and
* - how to use the Find("QueryString") function to get the nodes of interest
* by interactively navigating through the XML document.
*
* The Find() function finds a child or sibling or relative using a query
* string or path. A QueryString consists of multiple following items that are
* separated by '/':
* -[n] : an older sibling by distance 1 (when omitted) or n
* +[n] : a younger sibling by distance 1 (when omitted) or n
* n : a child at index n
* <tag>[:n] : a child at index 0 (when omitted) or n after filtering
* children with a tag name
* ![:n] : a child at index 0 (when omitted) or n within all text
* children
* :<id> : a child by id
* . : current node
* .. : parent node
* /<rpath> : absolute path (denote apath), search from the root
*
* An example XML file has been provided for this testing, which can be found
* at [ITK_HOME]/Testing/Data/InputXML/test.xml.
*/
#include <iostream>
#include "itkMacro.h"
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "arguments expected: test.xml test-slice.xml" << std::endl;
return EXIT_FAILURE;
}
try
{
// read a DOM object from an XML file
auto reader = itk::DOMNodeXMLReader::New();
reader->SetFileName(argv[1]);
reader->Update();
const itk::DOMNode::Pointer dom = reader->GetOutput();
// the following code demonstrates the DOM function Find("QueryString");
// it navigates through the loaded XML document by typing a query string
// on the console and displaying the returned result.
std::string query = "";
do
{
std::cout << "query = \"" << query << "\"" << std::endl;
const itk::DOMNode::Pointer dom2 = dom1->Find(query);
if ((itk::DOMNode *)dom2 == nullptr)
{
std::cout << "invalid query!" << std::endl;
}
else
{
dom1 = dom2;
std::cout << "tag : " << dom1->GetName() << std::endl;
std::cout << "path: " << dom1->GetPath() << std::endl;
std::cout << *dom1 << std::endl;
}
std::cout << std::endl << "type a query (... to quit) > ";
std::cin >> query;
} while (query != "...");
// write the sliced child DOM object to an XML file
auto writer = itk::DOMNodeXMLWriter::New();
writer->SetInput(dom1);
writer->SetFileName(argv[2]);
writer->Update();
}
catch (const itk::ExceptionObject & eo)
{
eo.Print(std::cerr);
return EXIT_FAILURE;
}
catch (...)
{
std::cerr << "Unknown exception caught!" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
itk::SmartPointer< Self >
itkDOMNodeXMLWriter.h
itkMacro.h
itk::ExceptionObject::Print
virtual void Print(std::ostream &os) const
itkDOMNodeXMLReader.h
itk::DOMNodeXMLReader::New
static Pointer New()
itk::DOMNode
Class to represent a node in a Document Object Model (DOM) tree structure.
Definition: itkDOMNode.h:53
itk::ExceptionObject
Standard exception handling object.
Definition: itkExceptionObject.h:50
itk::DOMNodeXMLWriter::New
static Pointer New()