使用msxml4.dll 解析xml
#import "E:\2015-12-24\xml\msxml4.dll" //msxml4.dll路径
class InitializeCom
{
public:
InitializeCom() {
CoInitialize(NULL); // Initializes the COM library
}
~InitializeCom() {
CoUninitialize(); // Closes the COM library
}
}InitCom;
{
CoInitialize(NULL); // COM对象初始化!
char *szXmlFile = "E:\\2015-12-24\\MFC_xml\\test.xml"; // xml文件
MSXML2::IXMLDOMDocumentPtr pDoc = NULL; // xml文档
MSXML2::IXMLDOMNodePtr pNode = NULL, pChildNode = NULL,pNameNode=NULL,pValueNode=NULL; // 节点
MSXML2::IXMLDOMNodeListPtr pNodeList = NULL; // 节点链表
MSXML2::IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)
MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap = NULL; //Getattributes返回值【该dll中将节点属性也作为节点来处理,如<Field name="name3" value=""/>当你获取field节点后,则
其那么属性和value属性也将作为两个节点来获取,可用getnodename和getnodevalue分别得到其名字和值】
long lChilds, lAttr, i;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); //使用DOMDocument40来创建实例
if (FAILED(hr))
{
}
VARIANT_BOOL vb = pDoc->load(szXmlFile); //加载已存在的xml文档 也可直接先将xml数据保存在BSTR中,然后直接加载_bstr_t即可
if (vb == VARIANT_FALSE)
{
}
if (pNode == NULL)
{
}
pRootElement = pDoc->GetfirstChild(); //得到第一个节点
pNodeList = pDoc->getElementsByTagName((_bstr_t)(char*)"Field"); //通过名称查找节点 查找所有名称为 field 的节点,并将其所有子节点保存在pnodelist中
lChilds = pNodeList->Getlength(); // 得到pnodelist长度,名称为field的节点个数
for (i = 0; i < lChilds; i++) //遍历
{
BSTR nameGet=0,valueGet=0;
_variant_t nameValue=0,valueValue=0;
CString Name = 0,Value=0;
pChildNode = pNodeList->Getitem(i); //通过index获取field节点
pAttrMap = pChildNode->Getattributes(); //得到该节点属性并保存在IXMLDOMNamedNodeMapPtr中
lAttr = pAttrMap->Getlenth(); //得到属性个数
pNameNode = pAttrMap->Getitem(0); //通过index得到属性
nameGet = pNameNode->GetnodeName(); // 得到该属性名称 -> name
nameValue = pNameNode->GetnodeValue();//得到该属性值 ->saleno
pValueNode = pAttrMap->Getitem(1);
valueGet = pValueNode->GetnodeName(); // -> value
valueValue = pValueNode->GetnodeValue(); // -> 15120703200110000152
Name = (LPCSTR)_bstr_t(nameValue); //BSTR转为CString
Value = (LPCSTR)_bstr_t(valueValue);
SysFreeString(nameGet); //释放BSTR指针
SysFreeString(valueGet);
}
CoUninitialize(); //关闭com对象
}
//----------------------------------------xml文档
<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><fjs1:GetsalenoLimitResponse xmlns:fjs1="http://www.dsc.com.tw/tiptop/TIPTOPServiceGateWay"><fjs1:response><Response>
<Execution>
<Status code="100" sqlcode="100" description="无此笔资料,或任何上下笔资料,或其他相关主档资料 !"/>
</Execution>
<ResponseContent>
<Parameter/>
<Document>
<RecordSet id="1">
<Master name="tc_doa_file">
<Record>
<Field name="saleno" value="15120703200110000152"/>
<Field name="saleamount" value="29.800000"/>
<Field name="invoice" value="29.800000"/>
<Field name="salenum1" value="1"/>
<Field name="item1" value="020916115506"/>
<Field name="name1" value="forza milan"/>
<Field name="qrty1" value="1.000"/>
<Field name="mount1" value="29.800000"/>
<Field name="salenum2" value=""/>
<Field name="item2" value=""/>
<Field name="name2" value=""/>
<Field name="qrty2" value=""/>
<Field name="mount2" value=""/>
<Field name="salenum3" value=""/>
<Field name="item3" value=""/>
<Field name="name3" value=""/>
<Field name="qrty3" value=""/>
<Field name="mount3" value=""/>
</Record>
</Master>
</RecordSet>
</Document>
</ResponseContent>
</Response></fjs1:response></fjs1:GetsalenoLimitResponse></SOAP-ENV:Body>