一个vc中使用msxml的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个vc中使用msxml的问题相关的知识,希望对你有一定的参考价值。

下面部分代码出现问题:
IXMLDOMDocumentPtr pDoc;
HRESULT hr;
hr = pDoc.CreateInstance(__uuidof(DOMDocument40));
if (FAILED(hr))
MessageBox( " 无法创建DOMDocument对象,请检查是否安装了MSXML Parser 运行库! " );
return;

其中FAILED(hr)总返回真值,也就是出现错误。但是不明白是哪出了问题。

请不要把网上关于msxml的文章或者链接粘过来,大部分我都看过了。

会不会是msxml4.dll的安装问题?我的机器里只有msxm3l.dll和msxml6.dll,我是下载了msxml4.dll放到工程文件夹中,然后#import"msxml.dll",难道是这里出的问题?

第一步,在stdafx.h加入2句:
#import <msxml3.dll> //导入动态库,装了IE5就有
using namespace MSXML2; //引用命名空间,
第二步:声明文档变量
MSXML2::IXMLDOMDocumentPtr pTestDomDocument;//故障参数文件

第三步:然后在代码中就可以使用
void CQuickTestView::GetPeizhiTable(int sendtype,char* buf)

::CoInitialize(NULL);
pDRTDomDocument.CreateInstance(__uuidof(DOMDocument30));//创建XML文档实例

MSXML2::IXMLDOMProcessingInstructionPtr pPI=NULL;
//创建处理指令
pDRTDomDocument->raw_createProcessingInstruction(_bstr_t(L"xml"),_bstr_t(L"version='1.0' encoding='utf-8'"),&pPI);
pDRTDomDocument->appendChild(pPI);

//创建根目录
MSXML2::IXMLDOMElementPtr pDRTDocRoot;
pDRTDocRoot = pDRTDomDocument->createElement((_bstr_t)"DRT");
pDRTDomDocument->appendChild(pDRTDocRoot);

MSXML2::IXMLDOMElementPtr pNode;
MSXML2::IXMLDOMElementPtr pChildNode;
MSXML2::IXMLDOMElementPtr pGrandChildNode;

CString str;
int smv_index = 32;
int goose_send_index = 32;
int goose_recv_index = 32;
int do_index = 0;
int di_index = 0;
int i = 0;
if(scfg.hd.smvst.uSmv_num > 0)

pNode = pDRTDomDocument->createElement((_bstr_t)"SMV_SEND");//创建根元素的一级子元素"SMV_SEND"
AppendChildToParent(pNode,pDRTDocRoot,1,FALSE);//添加根元素的一级子元素"SMV_SEND"
for(i = 0; i < scfg.hd.smvst.uSmv_num; i++)//创建"SMV"子元素

pChildNode = pDRTDomDocument->createElement((_bstr_t)"SMV");
str.Format("%d",scfg.hd.smvst.sSmvData[i].PortId);
pChildNode->setAttribute("ethId",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].sample_rate);
pChildNode->setAttribute("rate",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uASDUnum);
pChildNode->setAttribute("asduNum",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uSmvStyle);
pChildNode->setAttribute("protocol",(_bstr_t)str);

str.Format("%002x-%002x-%002x-%002x-%002x-%002x",scfg.hd.smvst.sSmvData[i].uDest_mac[0],scfg.hd.smvst.sSmvData[i].uDest_mac[1],\
scfg.hd.smvst.sSmvData[i].uDest_mac[2],scfg.hd.smvst.sSmvData[i].uDest_mac[3],\
scfg.hd.smvst.sSmvData[i].uDest_mac[4],scfg.hd.smvst.sSmvData[i].uDest_mac[5]);
pChildNode->setAttribute("mac",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uApp_id);
pChildNode->setAttribute("appId",(_bstr_t)str);
str.Format("%s",scfg.hd.smvst.sSmvData[i].cSVID);
pChildNode->setAttribute("svId",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uVlan_id);
pChildNode->setAttribute("vlanId",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uPriority);
pChildNode->setAttribute("priority",(_bstr_t)str);
str.Format("%d",scfg.hd.smvst.sSmvData[i].uAcessNum);
pChildNode->setAttribute("channelCount",(_bstr_t)str);
if(i < scfg.hd.smvst.uSmv_num-1)

AppendChildToParent(pChildNode,pNode,2,FALSE);

else//如果是最后一个SMV配置

AppendChildToParent(pChildNode,pNode,2,TRUE);

for(int j = 0; j < scfg.hd.smvst.sSmvData[i].uAcessNum; j++)

pGrandChildNode = pDRTDomDocument->createElement((_bstr_t)"CHNL");
str.Format("%d",smv_index++);
pGrandChildNode->setAttribute("index",(_bstr_t)str);
//jixina081016 针对SMV增加品质因素 注意区分9-1和9-2的不同。
if(scfg.hd.smvst.sSmvData[i].uSmvStyle == 0)//如果为9-1,每组SMV共用一个状态字。

UINT itemp;
BYTE btemp[4];
btemp[0] = scfg.hd.smvst.sSmvData[i].typeeword[2];
btemp[1] = scfg.hd.smvst.sSmvData[i].typeeword[3];
btemp[2] = scfg.hd.smvst.sSmvData[i].typeeword[0];
btemp[3] = scfg.hd.smvst.sSmvData[i].typeeword[1];
memcpy(&itemp,btemp,4);
str.Format("%d",itemp);
pGrandChildNode->setAttribute("q",(_bstr_t)str);

if(scfg.hd.smvst.sSmvData[i].uSmvStyle == 1)//如果为9-2,每组SMV的每个通道分别对应一个品质因素。

str.Format("%d",scfg.hd.smvst.sSmvData[i].uQuality[j]);
pGrandChildNode->setAttribute("q",(_bstr_t)str);


if(j < scfg.hd.smvst.sSmvData[i].uAcessNum-1)//?????????
AppendChildToParent(pGrandChildNode,pChildNode,3,FALSE);
else
AppendChildToParent(pGrandChildNode,pChildNode,3,TRUE);


参考技术A 请注册你的COM,方法"开始菜单"-"运行",然后输入
REGSVR32 x:\XXX\msxml4.dll
REGSVR32后面是msxml4.dll的路径本回答被提问者采纳

如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?

【中文标题】如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?【英文标题】:How to validate my own Schema XSD file againts XMLSchema.xsd using MSXML? 【发布时间】:2020-03-16 11:13:53 【问题描述】:
    我使用 Windows 和 MSXML 库 (msxml6.dll)。 我在当前主题中的示例也使用了 JS。 如何根据 XMLSchema.xsd 验证我自己的方案(XSD 文件)? 在下面的示例代码中有关于我遇到的问题的注释。
var xs, xd;

main();

function main() 

  try 
    xs = new ActiveXObject("MSXML2.XMLSchemaCache.6.0");
    xd = new ActiveXObject("MSXML2.DOMDocument.6.0");
  
  catch (e) 
    WScript.Echo("Mirosoft XML Core Services (MSXML) 6.0 is not installed.\n"
          +"Download and install MSXML 6.0 from http://msdn.microsoft.com/xml\n"
          +"before continuing.");
    return;
  

  try 
    xd.async = false;
    xd.validateOnParse = false;
    xd.setProperty('ResolveExternals', false);
    xd.setProperty('ProhibitDTD', false);
    xd.setProperty('UseInlineSchema', false);
    xd.setProperty('MultipleErrorMessages', true);
    xd.load("e:\\Temp\\__SuperTemp\\XMLSchema.xsd") // just loaded from here http://www.w3.org/2001/XMLSchema.xsd
  
  catch (e) 
    WScript.Echo("Failed to load schema cache: "+e.description);
    return;
  

  if (xd.parseError.errorCode != 0) 
     WScript.Echo("Failed to parse schema cache: "+xd.parseError.reason);
    return;
  

  try 
    // Here the error occured:
    //    XMLSchema.xsd#/schema/element[1][@name = 'schema']/complexType[1]/complexContent[1]/extension[1]/attribute[8]
    //    The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared.
    // I really dont know what to do around it :((

    xs.add("http://www.w3.org/2001/XMLSchema", xd);
  
  catch (e) 
    WScript.Echo("Failed to add schema cache: "+e.description);
    return;
  

  // Next I wanted to validate my own XSD against XMLSchema.xsd.
  // But the error above occured. Soo, the further code is skipped...


【问题讨论】:

【参考方案1】:

首先,用于模式文档的 W3C 模式 (S4SD) 做了一些用户模式中不允许的事情,例如定义新的原始类型,因此无法保证每个模式处理器都将其视为有效模式。我不知道 MSXML 是否存在问题(尽管它相当古老且令人尊敬......)

您遇到的具体问题似乎是 S4SD 导入了 XML 命名空间的架构

并且您似乎正在选择未声明 xml:lang 的该模式的一个版本。我不知道为什么会这样。可能值得进行某种监视,以查看 XML 名称空间的模式是否实际上是从该位置加载的。也许 MSXML 有一个“内置”版本的 XML 命名空间架构,它不包含这个属性?但我会认为这会破坏太多而无法实现。

我知道这不是一个完整的解决方案,但我希望它能带你前进。

【讨论】:

迈克尔,谢谢你的回答。我会在 S4SD 上了解更多信息。 BTW XMLPad (xmlpad-mobile.com) 可以验证模式。我刚刚从w3schools.com/xml/schema_example.asp 下载了shiporder.xsd,并在XMLPad 的帮助下对其进行了验证。它可以工作(如果我在架构中犯了错误,那么 XMLPad 会抓住它)!!!这意味着可以验证模式。可能是 XMLPad 使用的不是 MSXML 库... 对不起,我应该提到验证模式的最佳方法是将其加载到模式处理器中,而不是使用 schema-for-schema-documents。 S4SD 无法捕获的架构中可能出现许多错误。我错误地认为你知道这一点。 迈克尔,非常感谢。我只会在模式处理器(如 XMLPad)的帮助下制作自己的模式。在我朋友的帮助下,我发现add 方法中的MSXML2.XMLSchemaCache.6.0 可以验证模式。我无法质疑它。我想像疯子一样在 shema for shema XMLSchema.xsd 的帮助下强制 MSXML 像常规 XML 一样验证我的模式。现在我认为没有必要了。

以上是关于一个vc中使用msxml的问题的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2011:“MSXML2::IXMLDOMImplementation”:“struct”类型重新定义

怎样用vc++读写xml文件

我应该使用哪个版本的 MSXML?

System.Xml 是不是使用 MSXML?

使用 MSXML 在 Xml 中遍历节点

如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?