使用<;进口>;w/XSD&;XML解析器错误
我不明白这里发生了什么。据我所知,我的小解析器程序可以很好地传递我的XML&XSD更改和加载内容,但如果我将这些内容放到我们的生产系统中,它就会崩溃 我刚刚开始使用XSD导入语句。如果取出一些用户定义的类型并将它们全部放入XSD中,我会做什么 下面是一些典型的错误 文件“/home/dfcuser/dataElementsTrans.xsd”中出错,行=7,列=37,XML元素=,导入的架构“DFCTypes.xsd”具有不同的targetNameSpace”http://www.quikq.com/xsd/dataElementsTrans“根据声明的内容”http://www.quikq.com/DFCTypes" 文件“/home/dfcuser/dataElementsTrans.xsd”中出错,行=29,列=55,XML元素=,模式表示约束:命名空间'http://www.quikq.com/DFCTypes'被引用而没有声明 以下是示例文档的前言:使用<;进口>;w/XSD&;XML解析器错误,xml,xml-parsing,xsd,Xml,Xml Parsing,Xsd,我不明白这里发生了什么。据我所知,我的小解析器程序可以很好地传递我的XML&XSD更改和加载内容,但如果我将这些内容放到我们的生产系统中,它就会崩溃 我刚刚开始使用XSD导入语句。如果取出一些用户定义的类型并将它们全部放入XSD中,我会做什么 下面是一些典型的错误 文件“/home/dfcuser/dataElementsTrans.xsd”中出错,行=7,列=37,XML元素=,导入的架构“DFCTypes.xsd”具有不同的targetNameSpace”http://www.quikq.c
DFCTypes.xsd
------------
<xs:schema
targetNamespace="http://www.quikq.com/DFCTypes"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
dataElementsTrans.xsd
---------------------
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dfct="http://www.quikq.com/DFCTypes"
targetNamespace="http://www.quikq.com/xsd/dataElementsTrans"
xmlns="http://www.quikq.com/xsd/dataElementsTrans"
elementFormDefault="qualified" >
<xs:import schemaLocation="DFCTypes.xsd" namespace="http://www.quikq.com/DFCTypes" />
XML
---
<dataElementsTrans
xmlns="http://www.quikq.com/xsd/dataElementsTrans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quikq.com/xsd/dataElementsTrans dataElementsTrans.xsd">
DFCTypes.xsd
------------
dataElementsTrans.xsd
---------------------
XML
---
我的示例解析器程序和产品代码必须以不同的方式打开。我对这件事还很生疏,所以我有点挠头
谢谢 您显示其开始标记的xs:schema元素乍一看是正常的。我不希望他们引出这些错误信息
显示的错误消息表明,生产系统上的DFCTypes.xsd副本正在将其目标命名空间声明为
http://www.quikq.com/xsd/dataElementsTrans
而非http://www.quikq.com/DFCTypes
——可能是复制/粘贴错误,或者只是模式早期阶段的产物?(您不仅将用户定义的类型移动到它们自己的模式文档中,还将它们移动到它们自己的名称空间中。)您引用的第二条错误消息表明,正在处理的Trans.xsd副本缺少名称空间声明xmlns:dfct=”http://www.quikq.com/DFCTypes“
(正如第8行中对xs:import
元素的引用在第7行中一样)。因此,如果我是您,我的第一个动作是确保生产服务器上的架构处理器正在查找您认为它正在查找的文档。(我通常的做法是在我认为应该读取的文档中植入语法错误,并查看它们是否被标记。这对生产服务器来说可能有点苛刻,但如果它仍然失败了……)如果我把实体解析器代码放在示例解析器中,它会像我的生产程序一样爆炸。我得说我对使用实体解析器不太了解
类别定义:
class MyResolver : public EntityResolver {
private :
string m_path;
public :
MyResolver(string path) { m_path = path; }
InputSource* resolveEntity(const XMLCh* const publicId, const XMLCh* const systemId)
{
CStr2XStr path(m_path);
if (XMLString::compareString(systemId, path.unicodeForm())) {
return new LocalFileInputSource(path.unicodeForm());
} else {
return 0;
}
}
};
实际使用:
MyResolver *resolver = new MyResolver("/home/dfcuser/authNotify.xsd");
parser->setEntityResolver(resolver);
我想最直接的解决办法是删除或更正我的实体解析器内容。我希望听到一些评论!如果我将实体解析器代码放入示例解析器中,它会像我的生产程序一样爆炸。我得说我对使用实体解析器知之甚少。