You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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} 关联的文档")

代码说明

  1. 命名空间映射:显式声明XSD和自定义命名空间,避免路径解析错误。
  2. XPath逻辑:
    • //xsd:element[@name='{target_element}']:定位到指定名称的元素节点
    • substring-after(..., 'tns:'):提取type属性中冒号后的类型名(去掉命名空间前缀)
    • //xsd:complexType[@name=...]/xsd:annotation/xsd:documentation:找到对应类型下的文档节点
  3. 文本清理:用strip()去除文档文本中的首尾空白和换行符,输出更整洁的内容。

内容的提问来源于stack exchange,提问作者Sam12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:55:29