XML校验XSD报错:element元素无效、位置错误或出现次数过多
s4s-elt-invalid-content.1错误 嘿,看来你在XML和XSD的校验上碰钉子了!这个错误其实是XSD解析器在直白地告诉你:某个元素的内容完全不符合定义规则——要么是放错了位置,要么是出现次数不对,甚至可能这个元素根本就不允许出现在当前的父元素下面。
给你几个针对性的排查方向,一步步来应该能搞定:
先锁定出错元素的上下文
先找到XML第38行128列、第43行129列对应的具体元素,看看它们嵌套在哪个父元素里。错误里提到的#AnonType_symptomsmedicindatapatientpatientshospital是一个匿名类型,你需要去XSD里找到这个匿名类型的定义,仔细查看它允许的子元素序列、出现次数(比如minOccurs/maxOccurs参数)。核对元素顺序是否匹配XSD定义
XSD里的元素默认是顺序敏感的(除非用了xs:all组),如果你的XML里子元素的顺序和XSD里规定的不一样,直接就会触发这个错误。比如XSD定义的顺序是<symptoms>→<medicine>→<patient>,但你XML里写成了<patient>先出现,那就肯定报错。检查元素出现次数是否合规
看看XSD里对应元素的minOccurs和maxOccurs属性:比如某个元素被定义为maxOccurs="1",但你XML里重复写了两次;或者minOccurs="1"但你漏写了这个元素,这些情况都会触发错误。确认元素是否被父元素允许
仔细检查XML里的出错元素,是不是真的被包含在父元素的XSD定义里。有时候可能是拼写错误(比如XSD里是<medication>,你XML里写成了<medicine>),或者这个元素属于其他命名空间,但你没正确声明。
举个简单的例子,如果XSD里的匿名类型是这样的:
<xs:complexType> <xs:sequence> <xs:element name="symptoms" type="xs:string"/> <xs:element name="medicine" type="xs:string"/> <xs:element name="patient" type="xs:string" maxOccurs="1"/> </xs:sequence> </xs:complexType>
那你XML里要是把<patient>放在<symptoms>前面,或者重复写了两个<patient>,就会遇到你现在的错误。
你可以按照上面的步骤逐一排查,重点对比出错位置的元素和XSD里的定义,应该很快就能找到问题根源。
内容的提问来源于stack exchange,提问作者Nele

