DOM使用指定的Schema文件验证指定的XML为什么始终过不去呢?用XMLSpy就可以过去.急呀!!!!!!!!!!!!!!!!!!

sunmz_wjxy 2009-01-21 08:58:21
在本机有一个XML文件和一个Schema文件,可是在VC里用DOM加载Schema文件来验证XML文件,可就是不能通过.
可是为什么用XMLSpy就可以通过呢?
Schema文件太大,帖子不能发送.
我把Schema文件和XML发送到高手的邮箱,
高手指点一下
...全文
270 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbwhwc 2009-01-22
  • 打赏
  • 举报
回复
up
noenoughmemory 2009-01-22
  • 打赏
  • 举报
回复
up
fairyprince 2009-01-22
  • 打赏
  • 举报
回复
是的
除非你将 minOccurs="0" 属性设0 (没有的话加上这个属性)那么StructInfo节点就可有可无了
你可以到
http://www.w3school.com.cn/schema/index.asp
找到说明
ToperRay 2009-01-22
  • 打赏
  • 举报
回复
XSD就是这意思啊,有些节点是必须存在的,要想验证通过必须添加上必须的节点。
sunmz_wjxy 2009-01-22
  • 打赏
  • 举报
回复
我明白你指地方了.XSD里复合类型 MaterialType 是必须要有StructInfo子节点的.
但在XML里确没有这个StructInfo子节点,导致验证不通过.
不知道是不是这个意思?
fairyprince 2009-01-21
  • 打赏
  • 举报
回复
从上面看没有什么问题,不能功返回什么错误信息?

新建一个只有一个节点的XML 和 相应的 xsd 验证一下,程序代码无误!

不能功可以是 xsd 验证有问题,
xml 和 xsd 发给
fairyprince@163.com
sunmz_wjxy 2009-01-21
  • 打赏
  • 举报
回复
不明白你指的开头是什么?
这是XML的开头:

<?xml version="1.0" encoding="GB2312"?>
<AllForms xmlns="http://KM-Soft.Company.com/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://KM-Soft.Company.com/namespace D:\Project\CAMDSExcelAddin\Config\CAMDSSchema.xsd">


这是XSD开头
<xs:schema xmlns="http://KM-Soft.Company.com/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://KM-Soft.Company.com/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
fairyprince 2009-01-21
  • 打赏
  • 举报
回复
xml 和 xsd 代码,,两个文件开头部份
sunmz_wjxy 2009-01-21
  • 打赏
  • 举报
回复
首先感谢楼上的
我看了一下你的代码,感觉和我差不多.
代码如下:

MSXML2::IXMLDOMDocument2Ptr pXMLDoc;
HRESULT hr = pXMLDoc.CreateInstance(/*"Msxml2.DOMDocument"*/__uuidof(MSXML2::DOMDocument40));
pXMLDoc->PutvalidateOnParse(VARIANT_TRUE);
pXMLDoc->async = VARIANT_FALSE;

//load the XSD file
MSXML2::IXMLDOMSchemaCollectionPtr pSchemaCache;
hr = pSchemaCache.CreateInstance(__uuidof(MSXML2::XMLSchemaCache40));
// pXSDDoc->async = VARIANT_FALSE;


hr = pSchemaCache->add("http://KM-Soft.Company.com/namespace","D:\\Project\\CAMDSExcelAddin\\Config\\CAMDSSchema.xsd");
pXMLDoc->schemas = pSchemaCache.GetInterfacePtr();
//call validate
hr = pXMLDoc->load("D:\\CAMDS.xml");
if(pXMLDoc->parseError->errorCode != S_OK)
{
_bstr_t parseError = _bstr_t(_T("Error code: "))+ _bstr_t(pXMLDoc->parseError->errorCode) +_bstr_t("\n") + _bstr_t("Reason: ")+ pXMLDoc->parseError->Getreason();
MessageBox(GetActiveWindow(), parseError, _T("Parse Error"),MB_OK);
return FALSE;
}


但总是通不过,用SPY是OK的.
fairyprince 2009-01-21
  • 打赏
  • 举报
回复
注意要指定 CLSID_DOMDocument40

IXMLDOMDocument *pDocument = NULL;
::CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pDocument);
if(!pDocument)
{
::SysFreeString(xml);
return FALSE;
}
fairyprince 2009-01-21
  • 打赏
  • 举报
回复
//1 先创建一个 IXMLDOMSchemaCollection

IXMLDOMSchemaCollection *pIXMLDOMSchemaCollection=NULL;
::CoCreateInstance(CLSID_XMLSchemaCache40, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMSchemaCollection, (void**)&pIXMLDOMSchemaCollection);
if(!pIXMLDOMSchemaCollection)
{
return FALSE;
}
//2 加载xsd
pIXMLDOMSchemaCollection->add(L"你的空间名字URI",L"xxx.xsd");


//3 创建一个 DCOM IXMLDOMDocument * pDocument 创建过程略
IXMLDOMDocument2 *pIXMLDOMDocument2 = NULL;
pDocument->QueryInterface(IID_IXMLDOMDocument2,(void**)&pIXMLDOMDocument2);
if(pIXMLDOMDocument2 == NULL)
{
pDocument->Release();
return FALSE;
}
pDocument->put_async(VARIANT_FALSE);


VARIANT varValue;
varValue.vt = VT_DISPATCH;
varValue.pdispVal = pIXMLDOMSchemaCollection;

//设置验证器
hr = pIXMLDOMDocument2->putref_schemas(varValue);

//加载xml 略,验证通过成功,否则加载失败
上面一在手动设置验证

如果你的XML 有指定 xsd 并且可以找到(同目录或是公用URI)那么,xml会自动加载它并验证,不用手动

但你要清楚是你的 xsd 是否正确,排除程序代码上的错误!

sunmz_wjxy 2009-01-21
  • 打赏
  • 举报
回复
很急呀!!!!!!
fandh 2009-01-21
  • 打赏
  • 举报
回复
不知道,帮顶!!!
fairyprince 2009-01-21
  • 打赏
  • 举报
回复
xsd 没问题

xml 有问题
在第三个 和果后一个 Form 节点的子节点 Node 中没有以下节点,导致验证不能通过,
第三个类型为复合类型 MaterialType 你可以查看你自已的 xsd 并用pXMLDoc->parseError->get_line 和 pXMLDoc->parseError->get_linepos
确定错误位置
<StructInfo><Struct><Sequence>1</Sequence><ChildUID>2</ChildUID><Weight>100.200000</Weight><WeightUnit>KG</WeightUnit><PercentageMode></PercentageMode><PercentageMax>56.100000</PercentageMax><PercentageMin>658.010000</PercentageMin></Struct></StructInfo>

sunmz_wjxy 2009-01-21
  • 打赏
  • 举报
回复
弹出的错误消息码是:
XML_ELEMENT_NOT_COMPLETE 0xC00CE012
错误消息:
Element content is incomplete according to the DTD or schema.


XML和Schema已经发到邮件里去了.
ToperRay 2009-01-21
  • 打赏
  • 举报
回复
代码似乎无问题。

ToperRay 2009-01-21
  • 打赏
  • 举报
回复
_bstr_t parseError = _bstr_t(_T("Error code: "))+ _bstr_t(pXMLDoc->parseError->errorCode) +_bstr_t("\n") + _bstr_t("Reason: ")+ pXMLDoc->parseError->Getreason();
MessageBox(GetActiveWindow(), parseError, _T("Parse Error"),MB_OK);


这里弹出的是什么结果?

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧