首页 > 解决方案 > 未定义的 complexType 用作复杂类型扩展的基础

问题描述

我有一组 .xsd 文件,我试图用它来验证 C# 中的 xml 文件。我收到的错误消息是

未处理的异常。System.Xml.Schema.XmlSchemaValidationException:未定义的 complexType 'myNamespace:CDSInterchange_Structure' 用作复杂类型扩展的基础。

CDSInterchange_Structure在 root.xsd 中用作扩展名并在 000.xsd 中定义,但我不确定为什么会收到未定义的错误,因为我在 root.xsd 中包含 .xsd 文件

根.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="myNamespace" targetNamespace="myNamespace" elementFormDefault="qualified" attributeFormDefault="unqualified" version="6-2" id="XML_Message-V6-1-1-2010-12-10">
    <xs:include schemaLocation="Structures.xsd"/>
    <xs:include schemaLocation="000.xsd"/>
    <xs:element name="CDS-XMLInterchange" id="CommissioningDataSetInterchange">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="CDSInterchange_Structure">
                    <xs:attribute name="SchemaVersion" type="xs:NMTOKEN" use="required" fixed="6-2">
                    </xs:attribute>
                    <xs:attribute name="SchemaDate" type="xs:date" use="required" fixed="2012-05-11">
                    </xs:attribute>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

000.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="myNamespace" targetNamespace="myNamespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:include schemaLocation="Structures.xsd"/>
    <xs:complexType name="CDSInterchange_Structure" mixed="false">
        <xs:sequence>
            <xs:element name="CDSInterchangeHeader" type="ns:CDSInterchangeHeader_Structure"/>
            <xs:element name="CDSNetChange-All-MessageTypes" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="CDSMessageHeader" type="ns:CDSMessageHeader_Structure"/>
                        <xs:element name="CDSTransactionHeader_NetChange" type="ns:CDSTransactionHeader_NetChange_Structure"/>
                        <xs:element name="CDSMessageTrailer" type="ns:CDSMessageTrailer_Structure"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="CDSInterchangeTrailer" type="ns:CDSInterchangeTrailer_Structure"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

还有一个名为 Structures.xsd 的引用文件,我没有将其包括在内,因为它甚至还没有走那么远。这是我正在使用的 C# 验证代码:

public static bool XmlSchemaValidation(string xml, string xsdFilePath)
{
    ValidatorLog.Clear();

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(null, xsdFilePath);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += new ValidationEventHandler(SettingsValidationEventHandler);

    using (var stream = StreamFromString(xml))
    {
        XmlReader reader = XmlReader.Create(stream, settings);

        while (reader.Read()) { }
    }

    if (ValidatorLog.Errors > 0 || ValidatorLog.Warnings > 0)
    {
        ValidatorLog.GenerateLogtxt();

        Console.WriteLine(DateTime.Now.ToString("yyyyMMdd HH:mm:ss") + $" - {xsdFilePath} schema validation failed. {ValidatorLog.Errors} errors and {ValidatorLog.Warnings} warnings.");

        string dateTime = DateTime.Now.ToString("yyyyMMdd-HHmmss");

        File.WriteAllText($@"{Path.GetDirectoryName(xsdFilePath)}\log\{dateTime}_Validation_log.txt", ValidatorLog.Logtxt);

        return false;
    }
    else
    {
        return true;
    }
}

static void SettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
    if (e.Severity == XmlSeverityType.Warning)
    {
        ValidatorLog.Messages.Add("WARNING: " + e.Message + Environment.NewLine);
        ValidatorLog.Warnings++;
        Console.WriteLine("WARNING: " + e.Message);
    }
    else if (e.Severity == XmlSeverityType.Error)
    {
        ValidatorLog.Messages.Add("ERROR: " + e.Message + Environment.NewLine);
        ValidatorLog.Errors++;
        Console.WriteLine("ERROR: " + e.Message);
    }
}

非常感谢任何帮助我不精通xml。

标签: c#xmlxsdschema

解决方案


推荐阅读