1

我对 XmlSchemaException 向我抛出的消息感到困惑。让我提供一些上下文。在我的应用程序中,我使用两种类型的 XML 引用表:“IFU”和“CC”,它们都定义了自己的模式。当我加载文件时,我使用这些模式来验证它们并且它工作得很好。直到出现问题。

当应用程序需要 IFU ref 表(已选择 IFU 模式)而我加载 CC 表时,检测到错误,行号适合 (2),但消息显示:

e.Message = "未声明“CCReferenceTable”元素。"

虽然它应该说

e.Message = "未声明“IFUReferenceTable”元素。"

现在,代码片段:

LoadXML 例程

    public XmlDocument LoadXML(string filePath, string schemaFilePath)
    {
        Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory));
        if (!DoesFileExist(filePath))
            throw new Exception(String.Format("File {0} does not exist.", filePath));
        if (!DoesFileExist(schemaFilePath))
            throw new Exception(String.Format("File {0} does not exist.", schemaFilePath));

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add(null, schemaFilePath);
        settings.ValidationType = ValidationType.Schema;

        XmlDocument document = new XmlDocument();
        using (XmlReader reader = XmlReader.Create(filePath, settings))
        {
            document.Load(reader);
        }
        return document;
    }

XmlSchema

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="IfuReferenceTable">
    //////////Other content
  </xs:element>
</xs:schema>

XML 参考表

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IfuReferenceTable>
  //////////Other content
</IfuReferenceTable>

根节点的 CC Ref 表看起来相同(“CCRefenerceTable”而不是“IFUReferenceTable”)。

我错过了什么?

4

1 回答 1

0

你描述的是正常的诊断。

当应用程序需要 IFU ref 表(已选择 IFU 模式)而我加载 CC 表时,检测到错误,行号适合 (2),但消息显示:

e.Message = "The "CCReferenceTable" element is not declared."

当使用IfuReferenceTable模式的验证解析器(如你所说的“IFU 模式选择”)遇到一个CCReferenceTable它没有定义的元素时,它会正确地抱怨它。

可以这样想:当解析器看到CCReferenceTable时,它会尝试查找它所知道的内容CCReferenceTable。当它找不到任何关于的信息CCReferenceTable时,它会通过上述消息通知您。

Xerces-J 会这样说:

找不到元素“CCReferenceTable”的声明。

也许这个说法更清楚一点。

于 2013-10-11T11:15:25.463 回答