如何在XSD中通过XPath按元素名称获取关联的documentation
按XSD元素名称获取关联类型的文档文本
我需要让name3数组仅包含与<xsd:element name="PurchaseOrder" type="tns:PurchaseOrderType"/>关联的元素的documentation文本,要编写通用代码,根据XSD元素的名称输出对应的文档内容。目前已通过XPath获取所有documentation,需要添加筛选条件来实现需求。
相关XSD示例
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/PurchaseOrderSchema.xsd" targetNamespace="http://tempuri.org/PurchaseOrderSchema.xsd" elementFormDefault="qualified"> <xsd:element name="PurchaseOrder" type="tns:PurchaseOrderType"/> <xsd:complexType name="PurchaseOrderType"> <xsd:annotation> <xsd:documentation xml:lang="en"> commmennttt </xsd:documentation> </xsd:annotation> <xsd:sequence> <xsd:element name="ShipTo" type="tns:USAddress" maxOccurs="2"/> <xsd:element name="BillTo" type="tns:USAddress"/> </xsd:sequence> <xsd:attribute name="OrderDate" type="xsd:date"/> </xsd:complexType> <xsd:complexType name="USAddress"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:integer"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType> </xsd:schema>
初始代码
import lxml.etree as etree t3 = etree.ElementTree(file='new.xsd') name3 = t3.xpath("//xsd:documentation[text()]", namespaces={"xsd":"http://www.w3.org/2001/XMLSchema"}) name3 = [a.text for a in name3] print(name3[0])
修改后的通用代码
要实现按元素名称筛选,需要调整XPath逻辑:先找到指定名称的xsd:element,提取其关联的类型名,再定位到对应xsd:complexType下的documentation。
import lxml.etree as etree t3 = etree.ElementTree(file='new.xsd') # 定义命名空间映射 namespaces = { "xsd": "http://www.w3.org/2001/XMLSchema", "tns": "http://tempuri.org/PurchaseOrderSchema.xsd" } # 目标元素名称 target_element = "PurchaseOrder" # 一次性通过XPath完成筛选:找到目标元素的type属性,提取类型名后定位对应complexType的documentation name3 = t3.xpath( f"//xsd:complexType[@name=substring-after(//xsd:element[@name='{target_element}']/@type, 'tns:')]/xsd:annotation/xsd:documentation[text()]", namespaces=namespaces ) # 清理文本中的空白字符 name3 = [doc.text.strip() for doc in name3] if name3: print(name3[0]) else: print(f"未找到元素 {target_element} 关联的文档")
代码说明
- 命名空间映射:显式声明XSD和自定义命名空间,避免路径解析错误。
- XPath逻辑:
//xsd:element[@name='{target_element}']:定位到指定名称的元素节点substring-after(..., 'tns:'):提取type属性中冒号后的类型名(去掉命名空间前缀)//xsd:complexType[@name=...]/xsd:annotation/xsd:documentation:找到对应类型下的文档节点
- 文本清理:用
strip()去除文档文本中的首尾空白和换行符,输出更整洁的内容。
内容的提问来源于stack exchange,提问作者Sam12
相关产品推荐
相关产品推荐

