Jag är nybörjare på .Net (VC).
Mitt problem är att jag vill ladda en XML in i ett DataSet och sedan traversera den och göra saker med det som finns.
Min XML kan t.ex se ut så här:
<createData>
<ADK_OOI_HEAD_CUSTOMER_NAME>Patrik</ADK_OOI_HEAD_CUSTOMER_NAME>
<ADK_OOI_HEAD_TEXT1>Testfaktura med två rader</ADK_OOI_HEAD_TEXT1>
<ADK_OOI_HEAD_ROWS>
<ADK_DB_INVOICE_ROW>
<ADK_OOI_ROW_TEXT>Fakturarad 1</ADK_OOI_ROW_TEXT>
<ADK_OOI_ROW_PRICE2>100</ADK_OOI_ROW_PRICE2>
</ADK_DB_INVOICE_ROW>
<ADK_DB_INVOICE_ROW>
<ADK_OOI_ROW_TEXT>Fakturarad 2</ADK_OOI_ROW_TEXT>
<ADK_OOI_ROW_PRICE2>205</ADK_OOI_ROW_PRICE2>
</ADK_DB_INVOICE_ROW>
</ADK_OOI_HEAD_ROWS>
</createData>
Jag skulle nu vilja loopa igenom alla saker som finns i <createData> och som inte har saker under sig (alla utom ADK_OOI_HEAD_ROWS).
Sedan vill jag gå igenom alla saker under <ADK_OOI_HEAD_ROWS> och för alla saker där under så vill jag få fram alla datavärden där (t.ex <ADK_OOI_ROW_TEXT>).
Jag har kommit så långt att jag kan få fram kolumnvärden och datavärden från <createData>, men sen är det stopp.
Är det någon som förstår sig på hur ett DataSet fungerar och kan hjälpa mig på traven?
Så här ser min funktion ut:
// Description: Create data in database
// Parameters: type - Which database to create data in
// xmlData - Xml string
// writer - A valid instance of XmlWriter, will contain the XML-code afterwards
// Return value: XmlWriter resource
XmlWriter ^SPCSoapClass::_createData(int type, String ^xmlData, XmlWriter ^writer)
{
ADK_ERROR error;
ZeroMemory(&error, sizeof(ADK_ERROR));
PADK_DATA pData = AdkCreateData(type);
/*XmlTextReader ^reader = gcnew XmlTextReader(gcnew StringReader(xmlData));
reader->WhitespaceHandling = WhitespaceHandling::None;
reader->ReadStartElement();
// create updateList from XML
ArrayList ^createList = gcnew ArrayList();
while (!reader->LocalName->Equals(COMMAND_CREATE_DATA) && !reader->LocalName->Equals(""))
{
ArrayList ^item = gcnew ArrayList();
int field = AdkDbNameToId(AdkDbId(type), reader->LocalName);
String ^value = reader->ReadString();
item->Add(field);
item->Add(value);
createList->Add(item);
reader->Read();
}*/
DataSet ^xmlDataSet = gcnew DataSet();
xmlDataSet->ReadXml(gcnew StringReader(xmlData));
int keyFieldId = 0;
// Set pData structure from createList
int iTemp=0;
long int liTemp=0;
double dTemp=0;
char *strTemp=0;
//for (int i=0; i<createList->Count; i++)
DataTable ^table = xmlDataSet->Tables[0];
DataRow ^row = table->Rows[0];
for (int i=0; i<table->Columns->Count; i++)
{
DataColumn ^column = table->Columns[i];
//ArrayList ^item = (ArrayList ^)createList[i];
//ArrayList ^field = gcnew ArrayList();
//int fieldId = (int)item[0];
String ^colName = column->ColumnName;
int fieldId = AdkDbNameToId(AdkDbId(type), colName);
//String ^fieldValue = (String ^)item[1];
Type ^test = row[colName]->GetType();
String ^fieldValue = (String ^)row[colName];
if (AdkIsReadWrite(pData, pData->rgField[fieldId].iFieldId))
{
switch(pData->rgField[fieldId].iType)
{
case eBool: // eBool
iTemp = Convert::ToInt32(fieldValue);
AdkSetBool(pData, pData->rgField[fieldId].iFieldId, iTemp);
break;
case eChar: // eChar
strTemp = (char*) Marshal::StringToHGlobalAnsi(fieldValue).ToPointer();
AdkSetStr(pData, pData->rgField[fieldId].iFieldId, strTemp);
Marshal::FreeHGlobal(IntPtr(strTemp));
break;
case eDouble: //eDouble
dTemp = Convert::ToDouble(fieldValue);
AdkSetDouble(pData, pData->rgField[fieldId].iFieldId, dTemp);
break;
case eDate: // eDate
try {
liTemp = Convert::ToInt32(fieldValue);
AdkSetDate(pData, pData->rgField[fieldId].iFieldId, liTemp);
}
catch (...) {
strTemp = (char*) Marshal::StringToHGlobalAnsi(fieldValue).ToPointer();
AdkDateToLong(strTemp, &liTemp);
Marshal::FreeHGlobal(IntPtr(strTemp));
}
AdkSetDate(pData, pData->rgField[fieldId].iFieldId, liTemp);
break;
};
}
}
error = AdkAdd(pData);
AdkDeleteStruct(pData);
if (error.lRc != ADKE_OK)
SoapResponseError(&error);
writer->WriteStartElement(COMMAND_CREATE_DATA_RESULT_ELEMENT);
writer->WriteEndElement();
writer->Flush();
return writer;
}