⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 builder.cpp

📁 big c++英文版书籍
💻 CPP
字号:
#include <string>
#include <sstream>
#include <vector>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/framework/StdOutFormatTarget.hpp>

#include "item.h"

using namespace std;
using namespace xercesc;

/**
   Creates a DOM element with a given name.
   @param doc the document that creates the element
   @param name the element name
   @return an element with the given name
*/
DOMElement* create_element(DOMDocument* doc, string name)
{
   XMLCh* xname = new XMLCh[name.length() + 1];
   XMLString::transcode(name.c_str(), xname, name.length());
   DOMElement* r = doc->createElement(xname);
   delete xname;
   return r;
}

/**
   Creates a DOM element containing a text node.
   @param doc the document that creates the element
   @param name the element name
   @param text the text for the text node
   @return an element with the given name and a child that is a 
   text node with the given text
*/
DOMElement* create_text_element(DOMDocument* doc, 
   string name, string text)
{
   XMLCh* xtext = new XMLCh[text.length() + 1];
   XMLString::transcode(text.c_str(), xtext, text.length());
   DOMText* textNode = doc->createTextNode(xtext);
   delete xtext;

   DOMElement* r = create_element(doc, name);
   r->appendChild(textNode);

   return r;
}

/** 
   Converts an floating-point value to a string, e.g. 3.14 -> "3.14".
   @param n an floating-point value
   @return the equivalent string
*/   
string double_to_string(double n)
{  
   ostringstream outstr;
   outstr << n;
   return outstr.str();
}

/**
   Builds a DOM element for a product.
   @param p the product
   @return a DOM element describing the product
*/
DOMElement* create_product(DOMDocument* doc, const Product& p)
{
   DOMElement* description_element = create_text_element(doc, 
      "description", p.get_description());
   DOMElement* price_element = create_text_element(doc, 
      "price", double_to_string(p.get_price()));

   DOMElement* product_element = create_element(doc, "product");
   product_element->appendChild(description_element);
   product_element->appendChild(price_element);

   return product_element;
}

/**
   Builds a DOM element for an item.
   @param anItem the item
   @return a DOM element describing the item
*/
DOMElement* create_item(DOMDocument* doc, const Item& anItem)
{      
   DOMElement* product_element 
      = create_product(doc, anItem.get_product());
   DOMElement* quantity_element = create_text_element(doc, 
      "quantity", double_to_string(anItem.get_quantity()));
   
   DOMElement* item_element = create_element(doc, "item");
   item_element->appendChild(product_element);
   item_element->appendChild(quantity_element);

   return item_element;
}

/**
   Builds a DOM element for an array list of items.
   @param items the items
   @return a DOM element describing the items
*/      
DOMElement* create_item_list(DOMDocument* doc, 
   const vector<Item>& items)
{      
   DOMElement* items_element = create_element(doc, "items");
   for (int i = 0; i < items.size(); i++)
   {
      DOMElement* item_element = create_item(doc, items[i]);
      items_element->appendChild(item_element);
   }
   return items_element;
}

int main()
{
   XMLPlatformUtils::Initialize();

   // populate vector of items
   vector<Item> items;
   items.push_back(Item(Product("Toaster", 29.95), 3));
   items.push_back(Item(Product("Hair dryer", 24.95), 1));
   
   // build the DOM document
   DOMImplementation* implementation 
      = DOMImplementation::getImplementation();
   DOMDocument* doc = implementation->createDocument();
   doc->setStandalone(true);

   DOMElement* root = create_item_list(doc, items);
   doc->appendChild(root);

   // print the DOM document

   DOMWriter* writer = implementation->createDOMWriter();
   writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
   XMLFormatTarget* out = new StdOutFormatTarget();
   writer->writeNode(out, *doc);

   writer->release();
   doc->release();

   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -