XML验证触发cvc-complex-type.2.4.d错误,求解决方案
XML验证错误
cvc-complex-type.2.4.d的解决思路 错误核心原因
这个错误是因为你的XML结构完全不符合XSD的约束定义:当前XSD规定<dlc>元素只能包含一个子元素(要么是<nazwa>,要么是<wydane>),但实际XML里<dlc>下交替出现了多组<nazwa>+<wydane>,违反了规则导致验证失败。
你的XSD问题点
当前<dlc>的XSD定义存在限制:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:element name="nazwa" type="xs:string"/> <xs:element name="wydane" type="xs:string"/> <xs:element name="dlc"> <xs:complexType mixed="false"> <xs:sequence> <xs:choice> <xs:element ref="wydane"/> <xs:element ref="nazwa"/> </xs:choice> </xs:sequence> <xs:attribute name="rodzaj" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
这里的<xs:choice>只允许二选一,外层<xs:sequence>默认只允许出现一次,所以<dlc>只能有一个子元素,和你XML里的多组结构完全不匹配。
两种可行解决方法
方法1:规范XML结构(推荐)
把每个DLC的名称和发布日期封装成独立的<dlc-item>元素,让结构更清晰:
修改后的XSD
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:element name="nazwa" type="xs:string"/> <xs:element name="wydane" type="xs:string"/> <!-- 新增单个DLC项的定义 --> <xs:element name="dlc-item"> <xs:complexType> <xs:sequence> <xs:element ref="nazwa"/> <xs:element ref="wydane"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="dlc"> <xs:complexType mixed="false"> <xs:sequence> <!-- 允许无限次出现dlc-item --> <xs:element ref="dlc-item" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="rodzaj" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
对应调整后的XML片段
<dlc rodzaj="PayToPlay"> <dlc-item> <nazwa>By blood alone</nazwa> <wydane>2022.09.27</wydane> </dlc-item> <dlc-item> <nazwa>No step back</nazwa> <wydane>2021.11.23</wydane> </dlc-item> <!-- 其余DLC项依此类推 --> </dlc>
方法2:直接适配现有XML结构
如果不想修改XML,直接调整XSD,允许<nazwa>+<wydane>成对重复出现:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:element name="nazwa" type="xs:string"/> <xs:element name="wydane" type="xs:string"/> <xs:element name="dlc"> <xs:complexType mixed="false"> <xs:sequence> <!-- 定义一组nazwa+wydane,并允许无限次重复 --> <xs:sequence maxOccurs="unbounded"> <xs:element ref="nazwa"/> <xs:element ref="wydane"/> </xs:sequence> </xs:sequence> <xs:attribute name="rodzaj" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
这个方案无需修改现有XML,直接适配你当前的结构。
额外提醒
你的XML片段里还有未闭合的标签(比如<HeartsOfIron4>),后续验证时也会报错,记得补全所有闭合标签。
内容的提问来源于stack exchange,提问作者songo324
相关产品推荐
相关产品推荐

