如何用XSD Schema验证XML中Edges节点引用的Node合法性?
可以通过XSD的
key与keyref约束实现这类验证 这是XSD的标准特性,Python的lxml库完全支持基于该Schema的XML验证。以下是具体实现步骤:
1. 编写XSD Schema文件
通过key定义Nodes下Node节点id的唯一性约束,再用keyref让Edges中Edge节点的from、to属性强制引用这个键值:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Graph"> <xs:complexType> <xs:sequence> <!-- 定义Nodes节点结构 --> <xs:element name="Nodes"> <xs:complexType> <xs:sequence> <xs:element name="Node" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- 标记Node的id为全局唯一键 --> <xs:key name="nodeIdKey"> <xs:selector xpath="Node"/> <xs:field xpath="@id"/> </xs:key> </xs:element> <!-- 定义Edges节点结构 --> <xs:element name="Edges"> <xs:complexType> <xs:sequence> <xs:element name="Edge" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="from" type="xs:string" use="required"/> <xs:attribute name="to" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- 约束Edge的from必须指向存在的Node id --> <xs:keyref name="edgeFromRef" refer="nodeIdKey"> <xs:selector xpath="Edge"/> <xs:field xpath="@from"/> </xs:keyref> <!-- 约束Edge的to必须指向存在的Node id --> <xs:keyref name="edgeToRef" refer="nodeIdKey"> <xs:selector xpath="Edge"/> <xs:field xpath="@to"/> </xs:keyref> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
2. 示例XML文件
有效XML(符合约束)
<?xml version="1.0" encoding="UTF-8"?> <Graph> <Nodes> <Node id="1"/> <Node id="2"/> <Node id="3"/> </Nodes> <Edges> <Edge from="1" to="2"/> <Edge from="2" to="3"/> </Edges> </Graph>
无效XML(to值无对应Node id)
<?xml version="1.0" encoding="UTF-8"?> <Graph> <Nodes> <Node id="1"/> <Node id="2"/> </Nodes> <Edges> <Edge from="1" to="4"/> <!-- to值4未在Nodes中定义,验证失败 --> </Edges> </Graph>
3. Python lxml验证代码
加载XSD Schema并验证XML文件,捕获并输出验证错误:
from lxml import etree def validate_xml(xml_path, xsd_path): # 读取并解析XSD Schema with open(xsd_path, 'rb') as xsd_file: xsd_schema = etree.XMLSchema(etree.parse(xsd_file)) # 读取并解析XML文件 with open(xml_path, 'rb') as xml_file: xml_tree = etree.parse(xml_file) # 执行验证 if xsd_schema.validate(xml_tree): print(f"{xml_path} 验证通过") else: print(f"{xml_path} 验证失败,错误信息:") for error in xsd_schema.error_log: print(f"行号 {error.line}: {error.message}") # 验证有效XML validate_xml("valid.xml", "graph_schema.xsd") # 验证无效XML validate_xml("invalid.xml", "graph_schema.xsd")
运行后,无效XML会输出类似如下的错误:
invalid.xml 验证失败,错误信息: 行号 8: Key 'edgeToRef' with value '4' not found in the key identity constraint
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

