XML键值对参数定义规范及配套XSD编写方法咨询
核心问题解答
一、你当前XML的键值对写法是否合规
- 从XML语法规范层面,你采用的「独立配置容器下挂载多个带
key、value属性的空item元素存储键值对」的写法完全符合XML语法要求,不存在合规性问题,也是各类配置型XML非常通用的实现方式。 - 当前XML存在两个会直接导致校验失败的小问题:
- 根元素拼写为
all_configurqations(多写了字母q),后续XSD定义必须和这个拼写完全一致,否则会触发根元素不匹配的校验错误;如果是手误,建议统一改成正确拼写的all_configurations <port></port>为空白节点,如果你在XSD中把port定义为整数类型,空白内容会直接触发类型校验不通过,需要提前定义是否允许该元素为空
- 根元素拼写为
- 可选优化:这种写法本身没有规范禁忌,你可以后续通过XSD约束同容器下的
key值唯一,避免配置重复键导致的取值冲突。
二、匹配当前XML结构的XSD正确定义方式
你现有的XSD和实际XML结构存在三处核心不匹配,修正后即可完成正确约束:
- 元素名对齐:你原XSD给
ids、users、pass容器下定义的子元素名是id、user、password,但XML中实际使用的子元素统一为item,需要完全对齐成统一的item元素名 - 补全
item的属性约束:原XSD完全没有定义item必须携带的key、value两个属性,需要在item的complexType中补充两个属性的类型、必填规则 - 调整
port的类型规则:原XSD定义port为xs:int类型,和你XML中空白port节点的结构不匹配,需要根据实际需求调整为允许空白,或者要求port节点必须填写有效的整数端口值
修正后的完整XSD示例
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 定义通用的键值对item结构,减少重复代码 --> <xs:complexType name="KeyValueItem"> <xs:attribute name="key" type="xs:string" use="required" /> <xs:attribute name="value" type="xs:string" use="required" /> </xs:complexType> <xs:element name="all_configurqations"> <xs:complexType> <xs:sequence> <xs:element name="database"> <xs:complexType> <xs:sequence> <!-- ids 容器结构 --> <xs:element name="ids"> <xs:complexType> <xs:sequence> <xs:element name="item" type="KeyValueItem" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> <!-- 可选约束:同容器下key值不允许重复 --> <xs:unique name="UniqueIdKey"> <xs:selector xpath="item" /> <xs:field xpath="@key" /> </xs:unique> </xs:element> <!-- port 结构,匹配当前XML中的空白节点规则 --> <xs:element name="port"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="0" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- users 容器结构 --> <xs:element name="users"> <xs:complexType> <xs:sequence> <xs:element name="item" type="KeyValueItem" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:unique name="UniqueUserKey"> <xs:selector xpath="item" /> <xs:field xpath="@key" /> </xs:unique> </xs:element> <!-- pass 容器结构 --> <xs:element name="pass"> <xs:complexType> <xs:sequence> <xs:element name="item" type="KeyValueItem" maxOccurs="unbounded" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:unique name="UniquePassKey"> <xs:selector xpath="item" /> <xs:field xpath="@key" /> </xs:unique> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
注:上面示例中
port的规则是为了匹配你当前XML中空白节点的结构,如果后续port需要存有效端口号,可以把对应类型改回xs:int并要求节点必须填写内容。
内容的提问来源于stack exchange,提问作者R_S_C
相关产品推荐
相关产品推荐

