2025-11-28 00:35:46 +09:00

213 lines
6.8 KiB
C++

//-----------------------------------------------------------------------
// This file is part of the Windows SDK Code Samples.
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
// This source code is intended only as a supplement to Microsoft
// Development Tools and/or on-line documentation. See these other
// materials for detailed information regarding Microsoft code samples.
//
// THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//-----------------------------------------------------------------------
#include <atlbase.h>
#include <xmllite.h>
HRESULT WriteAttributes(IXmlReader* xmlReader)
{
PCWSTR pwszPrefix;
PCWSTR pwszLocalName;
PCWSTR pwszValue;
HRESULT hr = xmlReader->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;
}
if (S_OK == hr)
{
for (;;)
{
if (!xmlReader->IsDefault())
{
UINT cwchPrefix;
if (FAILED(hr = xmlReader->GetPrefix(&pwszPrefix, &cwchPrefix)))
{
wprintf(L"Error getting prefix, error is %08.8lx", hr);
return hr;
}
if (FAILED(hr = xmlReader->GetLocalName(&pwszLocalName, nullptr)))
{
wprintf(L"Error getting local name, error is %08.8lx", hr);
return hr;
}
if (FAILED(hr = xmlReader->GetValue(&pwszValue, nullptr)))
{
wprintf(L"Error getting value, error is %08.8lx", hr);
return hr;
}
if (cwchPrefix > 0)
wprintf(L"%s:%s=\"%s\" ", pwszPrefix, pwszLocalName, pwszValue);
else
wprintf(L"%s=\"%s\" ", pwszLocalName, pwszValue);
}
if (S_OK != xmlReader->MoveToNextAttribute())
break;
}
}
return hr;
}
int wmain(int argc, _In_reads_(argc) WCHAR* argv[])
{
CComPtr<IStream> fileStream;
CComPtr<IXmlReader> xmlReader;
CComPtr<IXmlReaderInput> xmlReaderInput;
XmlNodeType nodetype;
PCWSTR pwszPrefix;
PCWSTR pwszLocalName;
PCWSTR pwszValue;
UINT cwchPrefix;
PCWSTR file = (argc == 2) ? argv[1] : L"encoded.xml";
// Open read-only input stream
HRESULT hr = SHCreateStreamOnFileW(file, STGM_READ, &fileStream);
if (FAILED(hr))
{
wprintf(L"Error creating file reader, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = CreateXmlReader(IID_PPV_ARGS(&xmlReader), nullptr)))
{
wprintf(L"Error creating xml reader, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = CreateXmlReaderInputWithEncodingName(fileStream, nullptr, L"utf-16", FALSE,
L"c:\temp", &xmlReaderInput)))
{
wprintf(L"Error creating xml reader with encoding code page, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = xmlReader->SetInput(xmlReaderInput)))
{
wprintf(L"Error setting input for reader, error is %08.8lx", hr);
return -1;
}
for (;;)
{
hr = xmlReader->Read(&nodetype);
if (S_FALSE == hr)
break;
if (S_OK != hr)
{
wprintf(L"\nXmlLite Error: %08.8lx\n", hr);
return -1;
}
switch (nodetype)
{
case XmlNodeType_XmlDeclaration:
wprintf(L"<?xml ");
if (FAILED(hr = WriteAttributes(xmlReader)))
{
wprintf(L"Error, Method: WriteAttributes, error is %08.8lx", hr);
return -1;
}
wprintf(L"?>\r\n");
break;
case XmlNodeType_Element:
if (FAILED(hr = xmlReader->GetPrefix(&pwszPrefix, &cwchPrefix)))
{
wprintf(L"Error, Method: GetPrefix, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = xmlReader->GetLocalName(&pwszLocalName, nullptr)))
{
wprintf(L"Error, Method: GetLocalName, error is %08.8lx", hr);
return -1;
}
if (cwchPrefix > 0)
wprintf(L"<%s:%s ", pwszPrefix, pwszLocalName);
else
wprintf(L"<%s ", pwszLocalName);
if (FAILED(hr = WriteAttributes(xmlReader)))
{
wprintf(L"Error, Method: WriteAttributes, error is %08.8lx", hr);
return -1;
}
if (xmlReader->IsEmptyElement())
wprintf(L"/>");
else
wprintf(L">");
break;
case XmlNodeType_EndElement:
if (FAILED(hr = xmlReader->GetPrefix(&pwszPrefix, &cwchPrefix)))
{
wprintf(L"Error, Method: GetPrefix, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = xmlReader->GetLocalName(&pwszLocalName, nullptr)))
{
wprintf(L"Error, Method: GetLocalName, error is %08.8lx", hr);
return -1;
}
if (cwchPrefix > 0)
wprintf(L"</%s:%s>", pwszPrefix, pwszLocalName);
else
wprintf(L"</%s>", pwszLocalName);
break;
case XmlNodeType_Text:
case XmlNodeType_Whitespace:
if (FAILED(hr = xmlReader->GetValue(&pwszValue, nullptr)))
{
wprintf(L"Error, Method: GetValue, error is %08.8lx", hr);
return -1;
}
wprintf(L"%s", pwszValue);
break;
case XmlNodeType_CDATA:
if (FAILED(hr = xmlReader->GetValue(&pwszValue, nullptr)))
{
wprintf(L"Error, Method: GetValue, error is %08.8lx", hr);
return -1;
}
wprintf(L"<![CDATA[%s]]>", pwszValue);
break;
case XmlNodeType_ProcessingInstruction:
if (FAILED(hr = xmlReader->GetValue(&pwszValue, nullptr)))
{
wprintf(L"Error, Method: GetValue, error is %08.8lx", hr);
return -1;
}
wprintf(L"<?%s?>", pwszValue);
break;
case XmlNodeType_Comment:
if (FAILED(hr = xmlReader->GetValue(&pwszValue, nullptr)))
{
wprintf(L"Error, Method: GetValue, error is %08.8lx", hr);
return -1;
}
wprintf(L"<!--%s-->", pwszValue);
break;
case XmlNodeType_DocumentType:
wprintf(L"<!-- DOCTYPE is not printed -->\r\n");
break;
}
}
wprintf(L"\n");
return 0;
}