使用XSD验证XML文档时返回「element is not declared」错误如何解决
报错原因
核心原因是命名空间不匹配:
- 你的XSD文件定义了目标命名空间
http://www.contoso.com/Products,且配置了elementFormDefault="qualified",要求XSD中声明的所有元素(包括ArrayOfProduct和Product)都必须归属到该命名空间下 - 你的XML文件没有为元素绑定对应命名空间,验证器无法在指定命名空间下找到
Product元素的声明,因此抛出未声明错误。
解决方案
你可以根据业务需求选择任意一种方案修复:
方案1:修改XML文件,匹配XSD命名空间要求
给XML根节点添加默认命名空间声明即可,修改后的XML内容如下:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfProduct xmlns="http://www.contoso.com/Products" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Product IdProduct="1" NameProduct="1" PriceProduct="1" availability="1" IdSup="1" /> </ArrayOfProduct>
新增的xmlns="http://www.contoso.com/Products"表示当前文档所有无前缀的元素都归属到该命名空间,和XSD的定义完全匹配。
方案2:修改XSD和C#代码,移除命名空间约束
如果你的业务场景不需要使用命名空间约束,可以调整配置:
- 删除XSD的
targetNamespace属性,将elementFormDefault改为unqualified,修改后的XSD头部如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> <!-- 剩余的元素定义保持不变 --> </xs:schema>
- 修改C#中添加Schema的代码,将命名空间参数改为空字符串:
ProductSettings.Schemas.Add("", "XmlSchema.xsd");
内容的提问来源于stack exchange,提问作者ApocalipticCoder
相关产品推荐
相关产品推荐

