Light-weight, simple and fast XML parser for C++ with XPath support
Find a file
Arseny Kapoulkine f49d7acdfb Clarify the document element behavior.
pugixml currently unconditionally accepts documents with multiple
top-level element nodes in absence of parse_fragment. This is an
unfortunate omission; while it can be corrected, it will result in
regressions for some users, and it's trivial to perform the validity
check after the parse is done.

Because of this, for now we're just going to amend documentation here to
both highlight this in the W3C Conformance section, but also to more
strongly push users into realizing that there's just a single document
element (normally).

We might decide to change the behavior here to prohibit such documents
by default in the future, but for now a documentation change seems like
a better tradeoff.

Fixes #337
2020-05-02 09:47:34 -07:00
docs Clarify the document element behavior. 2020-05-02 09:47:34 -07:00
scripts Add "Include pugixml.cpp" and "Header Only" linkage options 2020-04-24 17:56:46 -07:00
src Adjust node_copy_tree to be more explicit about invariants 2020-02-19 21:02:33 -08:00
tests tests: Add a dedicated test for XPath variable conversion 2020-02-01 07:44:14 -08:00
.codecov.yml Add .codecov.yml to disable PR comments 2016-08-08 08:23:42 -07:00
.gitattributes Add .gitattributes file 2018-07-23 23:13:02 -07:00
.gitignore Update .gitignore 2017-06-20 21:11:35 -07:00
.travis.yml Move unreachable line handling to Makefile 2018-12-10 11:12:13 -08:00
appveyor.yml Update nuget creation to VS2019 (#291) 2019-09-09 07:37:29 -07:00
CMakeLists.txt Export targets from build directory 2020-04-27 16:02:56 -04:00
LICENSE.md Happy New Year! 2019-01-01 23:05:04 +03:00
Makefile Add LICENSE.md to RELEASE (#295) 2019-09-16 14:21:48 -07:00
README.md Update README.md 2018-04-12 10:07:26 -07:00
readme.txt Update version to 1.10 2019-09-11 21:09:50 -07:00

pugixml Build Status Build status codecov.io MIT

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving).

pugixml is used by a lot of projects, both open-source and proprietary, for performance and easy-to-use interface.

Documentation

Documentation for the current release of pugixml is available on-line as two separate documents:

Youre advised to start with the quick-start guide; however, many important library features are either not described in it at all or only mentioned briefly; if you require more information you should read the complete manual.

Example

Here's an example of how code using pugixml looks; it opens an XML file, goes over all Tool nodes and prints tools that have a Timeout attribute greater than 0:

#include "pugixml.hpp"
#include <iostream>

int main()
{
    pugi::xml_document doc;
    pugi::xml_parse_result result = doc.load_file("xgconsole.xml");
    if (!result)
        return -1;
        
    for (pugi::xml_node tool: doc.child("Profile").child("Tools").children("Tool"))
    {
        int timeout = tool.attribute("Timeout").as_int();
        
        if (timeout > 0)
            std::cout << "Tool " << tool.attribute("Filename").value() << " has timeout " << timeout << "\n";
    }
}

And the same example using XPath:

#include "pugixml.hpp"
#include <iostream>

int main()
{
    pugi::xml_document doc;
    pugi::xml_parse_result result = doc.load_file("xgconsole.xml");
    if (!result)
        return -1;
        
    pugi::xpath_node_set tools_with_timeout = doc.select_nodes("/Profile/Tools/Tool[@Timeout > 0]");
    
    for (pugi::xpath_node node: tools_with_timeout)
    {
        pugi::xml_node tool = node.node();
        std::cout << "Tool " << tool.attribute("Filename").value() <<
            " has timeout " << tool.attribute("Timeout").as_int() << "\n";
    }
}

License

This library is available to anybody free of charge, under the terms of MIT License (see LICENSE.md).