0

我不明白这里发生了什么。据我所知,我的小解析器程序通过了我的 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' 被引用但没有声明

以下是示例文档的序言:

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

我的示例解析器程序和生产代码必须以不同的方式打开某些东西。我对此仍然很陌生,所以我有点挠头。

谢谢!

4

2 回答 2

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

我想直接的解决方案是删除或更正我的实体解析器的东西。我很想听听一些评论!

于 2012-09-18T15:54:51.800 回答
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"(正如对xs:import第 8 行中的元素在第 7 行中)。因此,如果我是您,我的第一件事是确保生产服务器上的模式处理器正在查找您认为正在查找的文档。(我通常的做法是在我认为应该阅读的文档中植入语法错误,并查看它们是否被标记。这对于生产服务器来说可能有点苛刻,但如果它无论如何都失败了......)

于 2012-09-17T20:01:32.107 回答