From 35a201cc8ef0c3f5b2df88d2e528aabee1048348 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Fri, 30 Apr 2021 18:47:09 +0200 Subject: Initial/Final commit --- libxml2-2.9.10/doc/upgrade.html | 112 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 libxml2-2.9.10/doc/upgrade.html (limited to 'libxml2-2.9.10/doc/upgrade.html') diff --git a/libxml2-2.9.10/doc/upgrade.html b/libxml2-2.9.10/doc/upgrade.html new file mode 100644 index 0000000..f2f22af --- /dev/null +++ b/libxml2-2.9.10/doc/upgrade.html @@ -0,0 +1,112 @@ + + +Upgrading 1.x code
Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
Made with Libxml2 Logo

The XML C parser and toolkit of Gnome

Upgrading 1.x code

Developer Menu
API Indexes
Related links

Incompatible changes:

Version 2 of libxml2 is the first version introducing serious backward +incompatible changes. The main goals were:

    +
  • a general cleanup. A number of mistakes inherited from the very early + versions couldn't be changed due to compatibility constraints. Example + the "childs" element in the nodes.
  • +
  • Uniformization of the various nodes, at least for their header and link + parts (doc, parent, children, prev, next), the goal is a simpler + programming model and simplifying the task of the DOM implementors.
  • +
  • better conformances to the XML specification, for example version 1.x + had an heuristic to try to detect ignorable white spaces. As a result the + SAX event generated were ignorableWhitespace() while the spec requires + character() in that case. This also mean that a number of DOM node + containing blank text may populate the DOM tree which were not present + before.
  • +

How to fix libxml-1.x code:

So client code of libxml designed to run with version 1.x may have to be +changed to compile against version 2.x of libxml. Here is a list of changes +that I have collected, they may not be sufficient, so in case you find other +change which are required, drop me a +mail:

    +
  1. The package name have changed from libxml to libxml2, the library name + is now -lxml2 . There is a new xml2-config script which should be used to + select the right parameters libxml2
  2. +
  3. Node childs field has been renamed + children so s/childs/children/g should be applied + (probability of having "childs" anywhere else is close to 0+
  4. +
  5. The document don't have anymore a root element it has + been replaced by children and usually you will get a + list of element here. For example a Dtd element for the internal subset + and it's declaration may be found in that list, as well as processing + instructions or comments found before or after the document root element. + Use xmlDocGetRootElement(doc) to get the root element of + a document. Alternatively if you are sure to not reference DTDs nor have + PIs or comments before or after the root element + s/->root/->children/g will probably do it.
  6. +
  7. The white space issue, this one is more complex, unless special case of + validating parsing, the line breaks and spaces usually used for indenting + and formatting the document content becomes significant. So they are + reported by SAX and if your using the DOM tree, corresponding nodes are + generated. Too approach can be taken: +
      +
    1. lazy one, use the compatibility call + xmlKeepBlanksDefault(0) but be aware that you are + relying on a special (and possibly broken) set of heuristics of + libxml to detect ignorable blanks. Don't complain if it breaks or + make your application not 100% clean w.r.t. to it's input.
    2. +
    3. the Right Way: change you code to accept possibly insignificant + blanks characters, or have your tree populated with weird blank text + nodes. You can spot them using the commodity function + xmlIsBlankNode(node) returning 1 for such blank + nodes.
    4. +
    +

    Note also that with the new default the output functions don't add any + extra indentation when saving a tree in order to be able to round trip + (read and save) without inflating the document with extra formatting + chars.

    +
  8. +
  9. The include path has changed to $prefix/libxml/ and the includes + themselves uses this new prefix in includes instructions... If you are + using (as expected) the +
    xml2-config --cflags
    +

    output to generate you compile commands this will probably work out of + the box

    +
  10. +
  11. xmlDetectCharEncoding takes an extra argument indicating the length in + byte of the head of the document available for character detection.
  12. +

Ensuring both libxml-1.x and libxml-2.x compatibility

Two new version of libxml (1.8.11) and libxml2 (2.3.4) have been released +to allow smooth upgrade of existing libxml v1code while retaining +compatibility. They offers the following:

    +
  1. similar include naming, one should use + #include<libxml/...> in both cases.
  2. +
  3. similar identifiers defined via macros for the child and root fields: + respectively xmlChildrenNode and + xmlRootNode
  4. +
  5. a new macro LIBXML_TEST_VERSION which should be + inserted once in the client code
  6. +

So the roadmap to upgrade your existing libxml applications is the +following:

    +
  1. install the libxml-1.8.8 (and libxml-devel-1.8.8) packages
  2. +
  3. find all occurrences where the xmlDoc root field is + used and change it to xmlRootNode
  4. +
  5. similarly find all occurrences where the xmlNode + childs field is used and change it to + xmlChildrenNode
  6. +
  7. add a LIBXML_TEST_VERSION macro somewhere in your + main() or in the library init entry point
  8. +
  9. Recompile, check compatibility, it should still work
  10. +
  11. Change your configure script to look first for xml2-config and fall + back using xml-config . Use the --cflags and --libs output of the command + as the Include and Linking parameters needed to use libxml.
  12. +
  13. install libxml2-2.3.x and libxml2-devel-2.3.x (libxml-1.8.y and + libxml-devel-1.8.y can be kept simultaneously)
  14. +
  15. remove your config.cache, relaunch your configuration mechanism, and + recompile, if steps 2 and 3 were done right it should compile as-is
  16. +
  17. Test that your application is still running correctly, if not this may + be due to extra empty nodes due to formatting spaces being kept in libxml2 + contrary to libxml1, in that case insert xmlKeepBlanksDefault(1) in your + code before calling the parser (next to + LIBXML_TEST_VERSION is a fine place).
  18. +

Following those steps should work. It worked for some of my own code.

Let me put some emphasis on the fact that there is far more changes from +libxml 1.x to 2.x than the ones you may have to patch for. The overall code +has been considerably cleaned up and the conformance to the XML specification +has been drastically improved too. Don't take those changes as an excuse to +not upgrade, it may cost a lot on the long term ...

Daniel Veillard

-- cgit v1.2.3