Re: How to use libxml++ to write a file in c ++ xml



I think something is missing in xmlpp::Element. There is no way to create an xmlpp::EntityReference or an xmlpp::ProcessingInstructionNode. (They can be created when you parse an xml file, but I can find no way to create an xml file with those nodes without resorting to functions in the underlying libxml2.)

In the attached small program I have added an add_child_entity_reference() function. Then it's possible to write the file you want. I recommend that you file a bug on libxml++.

Kjell

2012-01-26 10:35, carlo esposito skrev:

Hi,
I'm using libxml + + library in C + +, and I have to write an xml file in which there is an inclusion of another xml file:

1 <? Xml version = "1.0"?>
2 <! DOCTYPE EXAMPLE SYSTEM "example.dtd" [
3 <! ENTITY xml "Extensible Markup Language">
4]>
5 <example>
6 &xml;
7 </ example>

I do not know
which the method to use the library libxml++ to write the line 6: "& xml" ,I saw the classes Document, Element, ..... but I have not found any method to use to write code in my xml file line 6.
Can you help ?

 


// Highly modified version of libxml++/examples/dom_build/main.cc

#include <libxml++/libxml++.h>
#include <libxml/tree.h>
#include <iostream>

// Wanted xml file:
// 1 <? Xml version = "1.0"?>
// 2 <! DOCTYPE EXAMPLE SYSTEM "example.dtd" [
// 3 <! ENTITY xml "Extensible Markup Language">
// 4]>
// 5 <example>
// 6 &xml;
// 7 </example>

namespace xmlpp
{
// Should be a member of xmlpp::Element, I think.
EntityReference* add_child_entity_reference(Element* element, const Glib::ustring& name)
{
  // A good implementation of add_child_entity_reference() ought to check
  // if xmlNewReference() or xmlNewCharRef() shall be called.
  xmlNode* node = xmlNewReference(element->cobj()->doc, (const xmlChar*)name.c_str());
  node = xmlAddChild(element->cobj(), node);
  Node::create_wrapper(node);
  return static_cast<EntityReference*>(node->_private);
}
} // end namespace xmlpp


int
main(int /* argc */, char** /* argv */)
{
  // Set the global C and C++ locale to the user-configured locale,
  // so we can use std::cout with UTF-8, via Glib::ustring, without exceptions.
  std::locale::global(std::locale(""));

  try
  {
    xmlpp::Document document;
    document.set_internal_subset("EXAMPLE", "", "example.dtd");
    document.set_entity_declaration("xml", xmlpp::XML_INTERNAL_GENERAL_ENTITY,
      "", "example.dtd", "Extensible Markup Language");

    xmlpp::Element* nodeRoot = document.create_root_node("example");

    nodeRoot->add_child_text("\n");
    xmlpp::add_child_entity_reference(nodeRoot, "xml");
    nodeRoot->add_child_text("\n");

    Glib::ustring whole = document.write_to_string();
    std::cout << "XML built at runtime: " << std::endl << whole << std::endl;
    document.write_to_file("example.xml");
  }
  catch(const std::exception& ex)
  {
    std::cout << "Exception caught: " << ex.what() << std::endl;
    return 1;
  }
  return 0;
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]