1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
// Helper function to create a DOM instance.
HRESULT CreateAndInitDOM(IXMLDOMDocument **ppDoc)
{
HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDoc));
if (SUCCEEDED(hr))
{
// these methods should not fail so don't inspect result
(*ppDoc)->put_async(VARIANT_FALSE);
(*ppDoc)->put_validateOnParse(VARIANT_FALSE);
(*ppDoc)->put_resolveExternals(VARIANT_FALSE);
(*ppDoc)->put_preserveWhiteSpace(VARIANT_TRUE);
}
return hr;
}
void queryNodes()
{
HRESULT hr = S_OK;
IXMLDOMDocument *pXMLDom = NULL;
IXMLDOMNodeList *pNodes = NULL;
IXMLDOMNode *pNode = NULL;
IXMLDOMNode *pNodeOrigin = NULL;
IXMLDOMNode *pNodeAdd = NULL;
IXMLDOMNode *pNodeReturn = NULL;
IXMLDOMParseError *pXMLErr = NULL;
IXMLDOMElement *pXMLElement = NULL;
BSTR bstrQuery1 = NULL;
BSTR bstrQuery2 = NULL;
BSTR bstrNodeName = NULL;
BSTR bstrNodeValue = NULL;
BSTR bstrTemp = NULL;
BSTR bstrXML = NULL;
BSTR bstrErr = NULL;
VARIANT_BOOL varStatus;
VARIANT varFileName;
VARIANT varTemp;
VariantInit(&varFileName);
VariantInit(&varTemp);
CHK_HR(CreateAndInitDOM(&pXMLDom)); // creation de l'instance
CHK_HR(VariantFromString(L"settingrtest.xml", varFileName));
hr = pXMLDom->load(varFileName, &varStatus); // chargement du fichier xml
if (varStatus != VARIANT_TRUE)
{
CHK_HR(ReportParseError(pXMLDom, "Failed to load DOM from stocks.xml."));
}
// Query a single node.
bstrQuery1 = SysAllocString(L"//bras[1]");
CHK_ALLOC(bstrQuery1);
// recuper l'adresse du noeud parent
hr = pXMLDom->selectSingleNode(bstrQuery1, &pNodeOrigin);
if (pNodeOrigin)
{
printf("Result from selectSingleNode:\n");
CHK_HR(pNodeOrigin->get_nodeName(&bstrNodeName));
printf("Node, <%S>:\n", bstrNodeName);
SysFreeString(bstrNodeName);
CHK_HR(pNodeOrigin->get_xml(&bstrNodeValue));
printf("\t%S\n\n", bstrNodeValue);
SysFreeString(bstrNodeValue);
SAFE_RELEASE(pNode);
}
else
{
CHK_HR(ReportParseError(pXMLDom, "Error while calling selectSingleNode."));
}
bstrQuery1 = SysAllocString(L"//bras[1]/mouvement[2]");
CHK_ALLOC(bstrQuery1);
// recupere l'adresse du noeud ou je veux faire mon insertion
hr = pXMLDom->selectSingleNode(bstrQuery1, &pNode);
if (pNode)
{
printf("Result from selectSingleNode:\n");
CHK_HR(pNode->get_nodeName(&bstrNodeName));
printf("Node, <%S>:\n", bstrNodeName);
SysFreeString(bstrNodeName);
CHK_HR(pNode->get_xml(&bstrNodeValue));
printf("\t%S\n\n", bstrNodeValue);
SysFreeString(bstrNodeValue);
//SAFE_RELEASE(pNode);
}
DOMNodeType type;
VARIANT varType;
// creation du noeud à inserer
SysReAllocString(&bstrNodeValue,L"nouveaunode");
varType.vt = VT_I2;
varType.iVal = NODE_ELEMENT;
bstrTemp = SysAllocString(L"");
CHK_ALLOC(bstrTemp);
hr = pXMLDom->createNode(varType,bstrNodeValue,bstrTemp,&pNodeAdd);
SysReAllocString(&bstrTemp,L"essai");
pNodeAdd->put_text(bstrTemp);
pNodeAdd->get_nodeName(&bstrNodeName);
pNodeAdd->get_text(&bstrNodeName);
pNodeAdd->get_xml(&bstrNodeValue);
CComVariant varRef;
varRef = pNode;
// insertion
hr = pNodeOrigin->insertBefore(pNodeAdd,varRef,&pNodeReturn);
sauvegarde
CHK_HR(pXMLDom->save(varFileName));
} |
Partager