Read
Reads the next node from the stream and returns the type of the node.
Syntax
HRESULT Read ([out] XmlNodeType * pXmlNodeType);
Arguments
pXmlNodeType
Returns the type of node that is read. This value can be NULL, in which case the node type will not be returned.
Return Value
Returns S_OK if no error is generated. Returns E_PENDING if the data is unavailable, and the stream is paused. At the end of the input stream, returns S_FALSE.
Remarks
In XmlLite, the reader is positioned on a node. When you get the value and attributes of the node, you get them for the node on which the reader is positioned. The Read
method moves the position of the reader to the next node in the stream; subsequent calls to the methods that get the values, name, and attributes return them for the new node.
This method skips attributes. To read attributes use the MoveToFirstAttribute, MoveToNextAttribute, and MoveToAttributeByName methods.
This method returns E_PENDING if the data is unavailable, and the stream is paused. The handling of the E_PENDING return value is up to the calling method.
The following code calls the Read method until there are no more nodes to read:
// Read through each node until the end
while (!pReader->IsEOF())
{
hr = pReader->Read(&nodeType);
// Check if E_PENDING is returned and perform custom action
// This is a sample of how one might handle E_PENDING
if (hr == E_PENDING)
{
// Alert user to the pending notification
wprintf(L"Error pending, error is %08.8lx", hr);
// As long as E_PENDING is returned keep trying to read
while (hr == E_PENDING){
::Sleep(1000);
hr = pReader->Read(&nodeType);
}
continue;
}
if (hr != S_OK)
break;
switch (nodeType) {
case XmlNodeType_XmlDeclaration:
wprintf(L"XmlDeclaration\n\n");
if (FAILED(hr = WriteAttributes(pReader))) {
wprintf(L"Error writing attributes, error is %08.8lx", hr);
return -1;
}
break;
case XmlNodeType_Element:
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 (cwchPrefix > 0)
wprintf(L"Element: %s:%s\n", pwszPrefix, pwszLocalName);
else
wprintf(L"Element: %s\n", pwszLocalName);
pReader->GetAttributeCount(&nAttrCount);
if (nAttrCount > 0){
if (FAILED(hr = WriteAttributes(pReader))) {
wprintf(L"Error writing attributes, error is %08.8lx", hr);
return -1;
}
if (FAILED(hr = pReader->MoveToElement())) {
wprintf(L"Error moving to the element that owns the current attribute node, error is %08.8lx", hr);
return -1;
}
}
if (pReader->IsEmptyElement() )
wprintf(L" (empty element)\n");
break;
case XmlNodeType_EndElement:
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 (cwchPrefix > 0)
wprintf(L"End Element: %s:%s\n", pwszPrefix, pwszLocalName);
else
wprintf(L"End Element: %s\n", pwszLocalName);
break;
case XmlNodeType_Text:
if (FAILED(hr = pReader->GetValue(&pwszValue, NULL))){
wprintf(L"Error getting value, error is %08.8lx", hr);
return -1;
}
wprintf(L"Text: %s\n", pwszValue);
break;
case XmlNodeType_Whitespace:
break;
case XmlNodeType_CDATA:
if (FAILED(hr = pReader->GetValue(&pwszValue, NULL))) {
wprintf(L"Error getting value, error is %08.8lx", hr);
return -1;
}
wprintf(L"CDATA: %s\n", pwszValue);
break;
case XmlNodeType_ProcessingInstruction:
if (FAILED(hr = pReader->GetLocalName(&pwszLocalName, NULL))) {
wprintf(L"Error getting 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;
}
wprintf(L"Processing Instruction name:%S value:%S\n", pwszLocalName, pwszValue);
break;
case XmlNodeType_Comment:
if (FAILED(hr = pReader->GetValue(&pwszValue, NULL))) {
wprintf(L"Error getting value, error is %08.8lx", hr);
return -1;
}
wprintf(L"Comment: %s\n", pwszValue);
break;
case XmlNodeType_DocumentType:
wprintf(L"DOCTYPE is not printed\n");
break;
}
}
Requirements
Header: XmlLite.h
Library: XmlLite.lib