如何解决命名空间“...”中的元素“...”具有无效的子元素,即使架构中存在子元素
我有一个 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 举报,一经查实,本站将立刻删除。