nishac189 Ответов: 2

Как получить значение из 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;
		

	}

2 Ответов

Рейтинг:
2

CPallini

Если использовать только ReadFile это ваше требование, то вы должны сами разобрать извлеченное XML строки (используя, например, строка:: найти[^] метод).


nishac189

ОКК спасибо

nishac189

Как я могу подсчитать количество узлов внутри XML

Рейтинг:
2

Richard MacCutchan

Перестаньте тратить время на чтение файла и используйте простой парсер, такой как Как xmllite[^].