命名空间“...”中的元素“...”具有无效的子元素,即使模式中存在子元素
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”具有无效的子元素“提供者”。预期的可能元素列表:“上下文”