使用<import> w / XSD&amp; XML解析器错误</import>

时间:2012-09-17 18:43:33

标签: xml xml-parsing xsd

我不明白这里发生了什么。我的小解析器程序通过我的XML&amp;从我所知道的情况来看,XSD会改变并加载很好的东西,但是如果我把这些东西放在我们的生产系统中,它会爆炸。

我刚刚开始使用XSD import语句。如果取出一些用户定义的类型并将它们放入XSD中,我已经完成了什么。

以下是一些典型错误

文件错误“/home/dfcuser/dataElementsTrans.xsd”,line = 7,column = 37,XML element =,导入架构'DFCTypes.xsd'有不同的targetNameSpace'http://www.quikq.com来自声明的'http://www.quikq.com/DFCTypes'的/ xsd / dataElementsTrans'

文件错误“/home/dfcuser/dataElementsTrans.xsd”,line = 29,column = 55,XML element =,Schema Representation Constraint:Namespace'http://www.quikq.com/DFCTypes'声明

以下是示例文档的序言:

    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">

我的示例解析器程序和生产代码必须以不同方式启用。我还是很绿,所以我有点不知所措。

谢谢!

2 个答案:

答案 0 :(得分:0)

您显示的起始标记的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行一样)。因此,如果我是您,我的第一个行为是确保生产服务器上的架构处理器找到您认为正在查找的文档。 (我通常的做法是在我认为它应该阅读的文档中植入语法错误,并查看它们是否被标记。对于生产服务器可能会觉得有点苛刻,但如果它仍然失败了......)

答案 1 :(得分:0)

如果我将实体解析器代码放在我的示例解析器中,它会像我的生产程序一样爆炸。我得说我对使用实体解析器知之甚少。

班级定义:

    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);

我想立即解决方案是删除或更正我的实体解析器内容。我很想听到一些评论!