【问题标题】:Using <import> w/ XSD & XML parser error将 <import> 与 XSD 和 XML 解析器一起使用时出错
【发布时间】:2012-09-17 18:43:33
【问题描述】:

我不明白这里发生了什么。据我所知,我的小解析器程序通过了我的 XML 和 XSD 更改并很好地加载了东西,但是如果我把这些东西放在我们的生产系统中,它就会爆炸。

我现在才开始使用 XSD 导入语句。如果取出一些用户定义的类型并将它们全部放入 XSD 中,我会做什么。

这里有一些典型的错误

文件“/home/dfcuser/dataElementsTrans.xsd”出错,行=7,列=37,XML 元素=,导入的架构“DFCTypes.xsd”具有不同的目标名称空间“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">

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

谢谢!

【问题讨论】:

    标签: xml xml-parsing xsd


    【解决方案1】:

    乍一看,您显示的开始标签的 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 行一样)。因此,如果我是您,我的第一件事是确保生产服务器上的模式处理器正在查找您认为正在查找的文档。 (我通常的做法是在我认为应该阅读的文档中植入语法错误,并查看它们是否被标记。这对于生产服务器来说可能感觉有点苛刻,但如果它无论如何都失败了......)

    【讨论】:

    • 如果我将实体解析器代码放入我的示例解析器中,它会像我的生产程序一样爆炸。我得说我对使用实体解析器了解不多。
    【解决方案2】:

    如果我将实体解析器代码放入示例解析器中,它会像我的生产程序一样爆炸。我得说我对使用实体解析器了解不多。

    类定义:

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

    我想直接的解决方案是删除或更正我的实体解析器内容。我很想听听一些 cmets!

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2013-08-04
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多