The attribute index is incorrectly incremented when the element contains properties, causing the wrong namespace to be fetched.
From: Spencer Wallace spencerwallace@esri.com
--- dlls/msxml3/element.c | 2 ++ dlls/msxml3/tests/domdoc.c | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 0fe72dcef9c..3e3c2d06169 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1812,6 +1812,8 @@ static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode * *item = create_node( (xmlNodePtr) curr ); return S_OK; } + + ++attrIndex; }
if (!node->nsDef) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 76f0c827c2a..175919b5169 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -10203,6 +10203,15 @@ static void test_get_attributes(void) L"xmlns:dcterms", L"xmlns:foaf" }; + const WCHAR *attributes[] = + { + L"rdf:about", + L"dcterms:created", + L"xmlns:oslc_am", + L"xmlns:rdf", + L"xmlns:dcterms", + L"xmlns:foaf" + }; const get_attributes_t *entry = get_attributes; IXMLDOMNamedNodeMap *map; IXMLDOMDocument *doc, *doc2; @@ -10484,6 +10493,50 @@ static void test_get_attributes(void)
IXMLDOMDocument_Release(doc);
+ str = SysAllocString(L"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + L"<rdf:RDF rdf:about="foo"" + L" dcterms:created="2025"" + L" xmlns:oslc_am="http://open-services.net/ns/am#%5C"" + L" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#%5C"" + L" xmlns:dcterms="http://purl.org/dc/terms/%5C"" + L" xmlns:foaf="http://xmlns.com/foaf/0.1/%5C" >" + L"</rdf:RDF>"); + + doc = create_document(&IID_IXMLDOMDocument2); + + hr = IXMLDOMDocument_loadXML(doc, str, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "got %d\n", b); + + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_get_attributes(elem, &map); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + length = -1; + hr = IXMLDOMNamedNodeMap_get_length(map, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 6, "length %#lx.\n", length); + + for(i=0; i < length; i++) + { + hr = IXMLDOMNamedNodeMap_get_item(map, i, &node2); + ok( hr == S_OK, "Unexpected hr %#lx (%ld).\n", hr, i); + + hr = IXMLDOMNode_get_nodeName(node2, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!lstrcmpW(str, attributes[i]), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + IXMLDOMNode_Release(node2); + } + + IXMLDOMNamedNodeMap_Release(map); + IXMLDOMElement_Release(elem); + + IXMLDOMDocument_Release(doc); + free_bstrs(); }