diff options
| -rw-r--r-- | docs/manual.qbk | 7 | ||||
| -rw-r--r-- | src/pugixml.cpp | 9 | ||||
| -rw-r--r-- | src/pugixml.hpp | 3 | ||||
| -rw-r--r-- | tests/test_document.cpp | 10 | 
4 files changed, 28 insertions, 1 deletions
diff --git a/docs/manual.qbk b/docs/manual.qbk index 8fb9564..fe45b30 100644 --- a/docs/manual.qbk +++ b/docs/manual.qbk @@ -327,7 +327,8 @@ Finally, here is a complete example of XML document and the corresponding tree r  Despite the fact that there are several node types, there are only three C++ types representing the tree (`xml_document`, `xml_node`, `xml_attribute`); some operations on `xml_node` are only valid for certain node types. They are described below.  [#xml_document] -`xml_document` is the owner of the entire document structure; it is a non-copyable class. The interface of `xml_document` consists of loading functions (see [sref manual.loading]), saving functions (see [sref manual.saving]) and the interface of `xml_node`, which allows for document inspection and/or modification. Note that while `xml_document` is a sub-class of `xml_node`, `xml_node` is not a polymorphic type; the inheritance is only used to simplify usage. +[#xml_document::document_element] +`xml_document` is the owner of the entire document structure; it is a non-copyable class. The interface of `xml_document` consists of loading functions (see [sref manual.loading]), saving functions (see [sref manual.saving]) and the interface of `xml_node`, which allows for document inspection and/or modification. Note that while `xml_document` is a sub-class of `xml_node`, `xml_node` is not a polymorphic type; the inheritance is only used to simplify usage. You can also use the `document_element` function to get the element node that's the immediate child of the document.  [#xml_document::ctor]  [#xml_document::dtor] @@ -1630,6 +1631,7 @@ Major release, featuring many XPath enhancements, wide character filename suppor      # Added parse_full parse flag mask, which extends parse_default with all node type parsing flags except parse_ws_pcdata      # Added xml_node::hash_value() and xml_attribute::hash_value() functions for use in hash-based containers      # Added internal_object() and additional constructor for both xml_node and xml_attribute for easier marshalling (useful for language bindings) +    # Added xml_document::document_element() function  * Performance improvements:      # xml_node::root() and xml_node::offset_debug() are now O(1) instead of O(logN) @@ -2117,6 +2119,9 @@ Classes:      * `void `[link xml_document::save save]`(xml_writer& writer, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;`      [lbr] +    * `xml_node `[link xml_document::document_element document_element]`() const;` +    [lbr] +  * `struct `[link xml_parse_result]      * `xml_parse_status `[link xml_parse_result::status status]`;`      * `ptrdiff_t `[link xml_parse_result::offset offset]`;` diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 1142930..f53ce1d 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -4595,6 +4595,15 @@ namespace pugi  		return true;  	} +    xml_node xml_document::document_element() const +    { +		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) +			if ((i->header & xml_memory_page_type_mask) + 1 == node_element) +                return xml_node(i); + +        return xml_node(); +    } +  #ifndef PUGIXML_NO_STL  	std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str)  	{ diff --git a/src/pugixml.hpp b/src/pugixml.hpp index 9b0d0d6..81fc6c3 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -764,6 +764,9 @@ namespace pugi  		// Save XML to file  		bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;  		bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + +        // Get document element +        xml_node document_element() const;  	};  #ifndef PUGIXML_NO_XPATH diff --git a/tests/test_document.cpp b/tests/test_document.cpp index d6163e2..e424836 100644 --- a/tests/test_document.cpp +++ b/tests/test_document.cpp @@ -866,3 +866,13 @@ TEST(document_load_exceptions)      CHECK(thrown);  }  #endif + +TEST_XML_FLAGS(document_element, "<?xml version='1.0'?><node><child/></node><!---->", parse_default | parse_declaration | parse_comments) +{ +    CHECK(doc.document_element() == doc.child(STR("node"))); +} + +TEST_XML_FLAGS(document_element_absent, "<!---->", parse_comments) +{ +    CHECK(doc.document_element() == xml_node()); +}  | 
