Mike Kaplinskiy : msxml: getElementsByTagName does not respect namespaces.

Alexandre Julliard julliard at winehq.org
Mon Jan 18 10:58:54 CST 2010


Module: wine
Branch: master
Commit: 90cf2f1ac3a46a3321ee1ad9b00b5efdf2248e9f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=90cf2f1ac3a46a3321ee1ad9b00b5efdf2248e9f

Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date:   Sat Jan 16 16:17:36 2010 -0500

msxml: getElementsByTagName does not respect namespaces.

We can't just use //tagname; we have to do //*[local-name()='tagname'].

---

 dlls/msxml3/domdoc.c  |   17 ++++++++++++++---
 dlls/msxml3/element.c |   19 +++++++++++++++----
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index be19e56..e75537f 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1279,14 +1279,25 @@ static HRESULT WINAPI domdoc_getElementsByTagName(
     BSTR tagName,
     IXMLDOMNodeList** resultList )
 {
+    static const WCHAR xpathformat[] =
+            { '/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 };
     domdoc *This = impl_from_IXMLDOMDocument2( iface );
     LPWSTR szPattern;
     HRESULT hr;
     TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList);
 
-    szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(2+lstrlenW(tagName)+1));
-    szPattern[0] = szPattern[1] = '/';
-    lstrcpyW(szPattern + 2, tagName);
+    if (tagName[0] == '*' && tagName[1] == 0)
+    {
+        szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*4);
+        szPattern[0] = szPattern[1] = '/';
+        szPattern[2] = '*';
+        szPattern[3] = 0;
+    }
+    else
+    {
+        szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(20+lstrlenW(tagName)+1));
+        wsprintfW(szPattern, xpathformat, tagName);
+    }
 
     hr = queryresult_create((xmlNodePtr)get_doc(This), szPattern, resultList);
     HeapFree(GetProcessHeap(), 0, szPattern);
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 63bf7af..b698042 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -666,6 +666,8 @@ static HRESULT WINAPI domelem_getElementsByTagName(
     IXMLDOMElement *iface,
     BSTR bstrName, IXMLDOMNodeList** resultList)
 {
+    static const WCHAR xpathformat[] =
+            { '.','/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 };
     domelem *This = impl_from_IXMLDOMElement( iface );
     LPWSTR szPattern;
     xmlNodePtr element;
@@ -673,10 +675,19 @@ static HRESULT WINAPI domelem_getElementsByTagName(
 
     TRACE("(%p)->(%s,%p)\n", This, debugstr_w(bstrName), resultList);
 
-    szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(3+lstrlenW(bstrName)+1));
-    szPattern[0] = '.';
-    szPattern[1] = szPattern[2] = '/';
-    lstrcpyW(szPattern+3, bstrName);
+    if (bstrName[0] == '*' && bstrName[1] == 0)
+    {
+        szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*5);
+        szPattern[0] = '.';
+        szPattern[1] = szPattern[2] = '/';
+        szPattern[3] = '*';
+        szPattern[4] = 0;
+    }
+    else
+    {
+        szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(21+lstrlenW(bstrName)+1));
+        wsprintfW(szPattern, xpathformat, bstrName);
+    }
     TRACE("%s\n", debugstr_w(szPattern));
 
     element = get_element(This);




More information about the wine-cvs mailing list