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

Posted

技术标签:

【中文标题】命名空间“...”中的元素“...”具有无效的子元素,即使模式中存在子元素【英文标题】:The element '...' in namespace '...' has invalid child element, even though child element exists in schema 【发布时间】:2021-07-18 02:56:29 【问题描述】:

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

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

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

我的架构、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");
    

【问题讨论】:

【参考方案1】:

在您的 XSD 中,更改

elementFormDefault="unqualified"

elementFormDefault="qualified"

elementFormDefault="unqualified" 的显式设置(也恰好是默认设置)意味着本地声明的元素不在命名空间中。这在您的情况下是不希望的(实际上很少需要)。更多详情请见What does elementFormDefault do in XSD?

【讨论】:

以上是关于命名空间“...”中的元素“...”具有无效的子元素,即使模式中存在子元素的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“http://yyy”中的子元素“xxx”无效,而 xml 中实际上没有额外的命名空间设置

元素“entityFramework”具有无效的子元素“提供者”。预期的可能元素列表:“上下文”

笔录1

使用 xpath 访问具有命名空间的子节点

元素“system.webServer”具有无效的子元素“rewrite”。我应该解决这个问题,如何解决?

安装vs2017后,RDLC 报表定义具有无法升级的无效目标命名空间