From 549befe706d3cf793de87d5d35bbef5b7a445228 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Tue, 23 Dec 2008 19:29:33 +1100 Subject: [PATCH] msxml3: Use xmlNodeGetContent to get text data. --- dlls/msxml3/node.c | 26 ++++++-------------------- dlls/msxml3/tests/domdoc.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 3169f351fe2..69601e39733 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -864,32 +864,18 @@ static HRESULT WINAPI xmlnode_get_text( { xmlnode *This = impl_from_IXMLDOMNode( iface ); BSTR str = NULL; + xmlChar *pContent; - TRACE("%p\n", This); + TRACE("%p type %d\n", This, This->node->type); if ( !text ) return E_INVALIDARG; - switch(This->node->type) - { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: + pContent = xmlNodeGetContent((xmlNodePtr)This->node); + if(pContent) { - xmlNodePtr child = This->node->children; - if ( child && child->type == XML_TEXT_NODE ) - str = bstr_from_xmlChar( child->content ); - break; - } - - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - str = bstr_from_xmlChar( This->node->content ); - break; - - default: - FIXME("Unhandled node type %d\n", This->node->type); + str = bstr_from_xmlChar(pContent); + xmlFree(pContent); } /* Always return a string. */ diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 0c8c14786ab..3d2944a10f2 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -260,6 +260,20 @@ static BOOL compareIgnoreReturns(BSTR sLeft, BSTR sRight) } } +static BOOL compareIgnoreReturnsWhitespace(BSTR sLeft, BSTR sRight) +{ + /* MSXML3 inserts whitespace where as libxml doesn't. */ + for (;;) + { + while (*sLeft == '\r' || *sLeft == '\n' || *sLeft == ' ') sLeft++; + while (*sRight == '\r' || *sRight == '\n' || *sRight == ' ') sRight++; + if (*sLeft != *sRight) return FALSE; + if (!*sLeft) return TRUE; + sLeft++; + sRight++; + } +} + static void get_str_for_type(DOMNodeType type, char *buf) { switch (type) @@ -1706,6 +1720,7 @@ static void test_get_text(void) VARIANT_BOOL b; IXMLDOMDocument *doc; IXMLDOMNode *node, *node2, *node3; + IXMLDOMNode *nodeRoot; IXMLDOMNodeList *node_list; IXMLDOMNamedNodeMap *node_map; long len; @@ -1726,6 +1741,19 @@ static void test_get_text(void) ok( r == S_OK, "ret %08x\n", r ); SysFreeString(str); + /* Test to get all child node text. */ + r = IXMLDOMDocument_QueryInterface(doc, &IID_IXMLDOMNode, (LPVOID*)&nodeRoot); + ok( r == S_OK, "ret %08x\n", r ); + if(r == S_OK) + { + r = IXMLDOMNode_get_text( nodeRoot, &str ); + ok( r == S_OK, "ret %08x\n", r ); + ok( compareIgnoreReturnsWhitespace(str, _bstr_("fn1.txt\n\n fn2.txt \n\nf1\n")), "wrong get_text\n"); + SysFreeString(str); + + IXMLDOMNode_Release(nodeRoot); + } + if (0) { /* this test crashes on win9x */ r = IXMLDOMNodeList_QueryInterface(node_list, &IID_IDispatch, NULL); -- 2.11.4.GIT