微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

命名空间“...”中的元素“...”具有无效的子元素,即使架构中存在子元素

如何解决命名空间“...”中的元素“...”具有无效的子元素,即使架构中存在子元素

我有一个 xml 架构文件,该文件描述了一个名为 MessageProcessingResult 的元素,该元素可以具有子元素“MessageID”和“Category”。我的 xml 显然具有这些元素,但是当我根据架构验证 xml 时,我收到一条错误消息,指出“类别”元素无效:

命名空间中的元素“MessageProcessingResult” “http://test.com/MessageProcessing”的子元素无效 命名空间“http://test.com/MessageProcessing”中的“类别”。列表 预期的可能元素:“类别,消息 ID”。

我一定是错误地定义了我的架构,但我不知道它到底是什么。

我的schema、xml和验证码如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://test.com/MessageProcessing" 
    targetNamespace="http://test.com/MessageProcessing" 
    elementFormDefault="unqualified"
    attributeFormDefault="unqualified">

    <xs:element name="MessageProcessingResult">
        <xs:complexType>
            <xs:all>
                <xs:element name="MessageID" type="xs:string" minOccurs="1" maxOccurs="1"/>

                <xs:element name="Category">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="Success"/>
                            <xs:enumeration value="Problem"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

看起来像这样的xml:

<MessageProcessingResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://test.com/MessageProcessing">
    <Category>Success</Category>
    <MessageID>id</MessageID>
</MessageProcessingResult>

我使用此代码进行验证:

public class XmlValidator
{
    public void Validate(Stream strXml)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        //settings.Schemas.Add(null,@"Schema\MessageProcessingResults.xsd");
        settings.Schemas.Add(null,@"Schema\MessageProcessingResult.xsd");

        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(XmlSchemaValidationEventHandler);

        XmlReader xml = XmlReader.Create(strXml,settings);

        this.Errors = new List<string>();

        while (xml.Read()) { }
    }

    public List<string> Errors { get; set; }

    private void XmlSchemaValidationEventHandler(object sender,ValidationEventArgs e)
    {
        this.Errors.Add($"{e.Severity} {e.Message}");
    }
}

解决方法

在您的 XSD 中,更改

elementFormDefault="unqualified"

elementFormDefault="qualified"

您对 elementFormDefault="unqualified" 的显式设置(这也恰好是默认设置)意味着本地声明的元素不在命名空间中。这在您的情况下是不受欢迎的(实际上很少需要)。有关详细信息,请参阅 What does elementFormDefault do in XSD?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。