Commit 90cf2f1a authored by Mike Kaplinskiy's avatar Mike Kaplinskiy Committed by Alexandre Julliard

msxml: getElementsByTagName does not respect namespaces.

We can't just use //tagname; we have to do //*[local-name()='tagname'].
parent 152c0d4b
...@@ -1279,14 +1279,25 @@ static HRESULT WINAPI domdoc_getElementsByTagName( ...@@ -1279,14 +1279,25 @@ static HRESULT WINAPI domdoc_getElementsByTagName(
BSTR tagName, BSTR tagName,
IXMLDOMNodeList** resultList ) IXMLDOMNodeList** resultList )
{ {
static const WCHAR xpathformat[] =
{ '/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 };
domdoc *This = impl_from_IXMLDOMDocument2( iface ); domdoc *This = impl_from_IXMLDOMDocument2( iface );
LPWSTR szPattern; LPWSTR szPattern;
HRESULT hr; HRESULT hr;
TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList); TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList);
szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(2+lstrlenW(tagName)+1)); if (tagName[0] == '*' && tagName[1] == 0)
szPattern[0] = szPattern[1] = '/'; {
lstrcpyW(szPattern + 2, tagName); 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); hr = queryresult_create((xmlNodePtr)get_doc(This), szPattern, resultList);
HeapFree(GetProcessHeap(), 0, szPattern); HeapFree(GetProcessHeap(), 0, szPattern);
......
...@@ -666,6 +666,8 @@ static HRESULT WINAPI domelem_getElementsByTagName( ...@@ -666,6 +666,8 @@ static HRESULT WINAPI domelem_getElementsByTagName(
IXMLDOMElement *iface, IXMLDOMElement *iface,
BSTR bstrName, IXMLDOMNodeList** resultList) 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 ); domelem *This = impl_from_IXMLDOMElement( iface );
LPWSTR szPattern; LPWSTR szPattern;
xmlNodePtr element; xmlNodePtr element;
...@@ -673,10 +675,19 @@ static HRESULT WINAPI domelem_getElementsByTagName( ...@@ -673,10 +675,19 @@ static HRESULT WINAPI domelem_getElementsByTagName(
TRACE("(%p)->(%s,%p)\n", This, debugstr_w(bstrName), resultList); TRACE("(%p)->(%s,%p)\n", This, debugstr_w(bstrName), resultList);
szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(3+lstrlenW(bstrName)+1)); if (bstrName[0] == '*' && bstrName[1] == 0)
szPattern[0] = '.'; {
szPattern[1] = szPattern[2] = '/'; szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*5);
lstrcpyW(szPattern+3, bstrName); 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)); TRACE("%s\n", debugstr_w(szPattern));
element = get_element(This); element = get_element(This);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment