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