#include "stdafx.h"
#include <atlbase.h>
#include "xmllite.h"
#include <strsafe.h>
#include <map>
#include <string>
using namespace std;
typedef map<wstring, wstring> SingleMap;
typedef map<wstring, SingleMap> ComplexMap;
HRESULT WriteAttributes(IXmlReader* pReader, ComplexMap& complexMap, const WCHAR* element_prefix, const WCHAR* element_name)
{
const WCHAR* pwszPrefix;
const WCHAR* pwszLocalName;
const WCHAR* pwszValue;
HRESULT hr = pReader->MoveToFirstAttribute();
if (S_FALSE == hr)
return hr;
if (S_OK != hr)
{
wprintf(L"Error moving to first attribute, error is %08.8lx", hr);
return -1;
}
else
{
wstring strElement(element_prefix);
strElement += wstring(L":");
strElement += wstring(element_name);
SingleMap singleMap;
while (TRUE)
{
if (!pReader->IsDefault())
{
UINT cwchPrefix;
if (FAILED(hr = pReader->GetPrefix(&pwszPrefix, &cwchPrefix)))
{
wprintf(L"Error getting prefix, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->GetLocalName(&pwszLocalName, NULL)))
{
wprintf(L"Error getting local name, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->GetValue(&pwszValue, NULL)))
{
wprintf(L"Error getting value, error is %08.8lx", hr);
return -1;
}
//if (cwchPrefix > 0)
// wprintf(L"Attr: %s:%s=/"%s/" /n", pwszPrefix, pwszLocalName, pwszValue);
//else
// wprintf(L"Attr: %s=/"%s/" /n", pwszLocalName, pwszValue);
wstring strName(pwszLocalName);
wstring strValue(pwszValue);
singleMap.insert(make_pair(strName, strValue));
}
if (S_OK != pReader->MoveToNextAttribute())
break;
}
complexMap.insert(make_pair(strElement, singleMap));
}
return hr;
}
void PrintAttributes(ComplexMap& complexMap)
{
ComplexMap::iterator it = complexMap.begin();
for(; it != complexMap.end(); it ++)
{
wstring element_name(it->first);
wprintf(L"-----------------------------------/n");
wprintf(L"Element Name:%s/n", element_name.c_str());
SingleMap singleMap = (SingleMap)it->second;
SingleMap::iterator ite = singleMap.begin();
for(; ite != singleMap.end(); ite ++)
{
wstring attr(ite->first);
wstring value(ite->second);
wprintf(L"Attr:%s/tValue:%s/n", attr.c_str(), value.c_str());
}
}
}
int _tmain(int argc, WCHAR* argv[])
{
HRESULT hr;
CComPtr<IStream> pFileStream;
CComPtr<IXmlReader> pReader;
XmlNodeType nodeType;
const WCHAR* pwszPrefix;
const WCHAR* pwszLocalName;
//const WCHAR* pwszValue;
UINT cwchPrefix;
ComplexMap complexMap;
if (argc != 2)
{
wprintf(L"Usage: XmlLiteReader.exe name-of-input-file/n");
return 0;
}
//Open read-only input stream
if (FAILED(hr = SHCreateStreamOnFile(argv[1], STGM_READ, &pFileStream)))
{
wprintf(L"Error creating file reader, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = CreateXmlReader(__uuidof(IXmlReader), (void**) &pReader, NULL)))
{
wprintf(L"Error creating xml reader, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->SetProperty(XmlReaderProperty_DtdProcessing, DtdProcessing_Prohibit)))
{
wprintf(L"Error setting XmlReaderProperty_DtdProcessing, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->SetInput(pFileStream)))
{
wprintf(L"Error setting input for reader, error is %08.8lx", hr);
return -1;
}
while(S_OK == (hr = pReader->Read(&nodeType)))
{
if(XmlNodeType_Element == nodeType)
{
if (FAILED(hr = pReader->GetPrefix(&pwszPrefix, &cwchPrefix)))
{
wprintf(L"Error getting prefix, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->GetLocalName(&pwszLocalName, NULL)))
{
wprintf(L"Error getting local name, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = WriteAttributes(pReader, complexMap, pwszPrefix, pwszLocalName)))
{
wprintf(L"Error writing attributes, error is %08.8lx", hr);
return -1;
}
}
}
PrintAttributes(complexMap);
return 0;
}