Как получить значение из CDATA XML с помощью readfile?
Я хочу получить значение из XML, данные которого находятся в форме CDATA.Но я читаю XML с помощью функции ReadFile (эта функция обязательна для чтения файла), я не могу использовать любую другую опцию для чтения XML(без DOM и SAX).Его требование, чтобы прочитать XML, используя только функцию ReadFile.
как только он прочитан, получите полный xml в виде строки и получите значение тега, значения которого находятся в CDATA.
Ниже приведен XML:
<namespace> <ns1> <ns1name><![CDATA[MyData1</ns1name> <class> <cs1> <cs1name><![CDATA[ComputerSystem</cs1name> <property><![CDATA[DomainName@@SystemInfo@@IPAddress@MacAddress </property> </cs1> </class> </ns1> <ns2> <ns2name><![CDATA[MyData2</ns2name> <class> <cs1> <cs1name><![CDATA[OtherDetails</cs1name> <property><![CDATA[Caption@#@Description@#@ElementName@#@InstallDate</property> </cs1> </class> </ns2> </namespace>
выход:
Не считать ни одного ребенка в XML??
Значение CDATA внутри тегов.
Что я уже пробовал:
// XMLSample.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #include<string> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { wchar_t AppPath[MAX_PATH] = { 0 }; wchar_t XMLfilePath[MAX_PATH] = { 0 }; wchar_t *pwszFindChar = NULL; //stDBStart structDBStart = { 0 }; GetModuleFileName(NULL,AppPath, MAX_PATH); pwszFindChar = wcsrchr(AppPath, L'\\'); if (NULL == pwszFindChar) { return 0; } *pwszFindChar = NULL; lstrcpyW(XMLfilePath, AppPath); lstrcatW(XMLfilePath,L"\\HyperV.xml"); DWORD dwIniLen = 0; dwIniLen = ::GetCompressedFileSizeW(XMLfilePath, 0); dwIniLen *= 2; HANDLE hFile = NULL; DWORD dwFileSize=0; DWORD dwReadBuffer = 0; wchar_t* pszBuffer = { 0 }; hFile = CreateFileW(XMLfilePath, GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); dwIniLen = ::GetCompressedFileSize(XMLfilePath, 0); dwIniLen *= 2; //wchar_t* buffer = new wchar_t[dwIniLen]; pszBuffer = new wchar_t[dwIniLen]; //wchar_t pszBuffer[dwFileSize] = { '\0' }; wmemset(pszBuffer, NULL, (dwIniLen)); ::ReadFile(hFile, pszBuffer, dwIniLen, &dwReadBuffer, 0); wstring ws(pszBuffer); // your new String string xmlContent(ws.begin(), ws.end()); /*if (xmlContent.find())*/ if (0 == dwReadBuffer) { CloseHandle(hFile); } else { } CloseHandle(hFile); return 0; }