在专利信息系统对接中,XML因其可读性与结构化能力成为主流交换格式。但不同国家专利局、代理机构对同样一份专利文献的字段命名和层级理解差异很大,导致接收方解析失败或丢失关键信息。要解决好这类问题,必须建立一套明确的XML专利数据标准,从文档结构、编码规则到校验机制形成统一约定。

一、专利XML文档的结构定义
专利数据标准的第一步是确定文档的骨架。通常采用DTD或XSD来约束元素关系。一份基础的专利XML应包含文献标识、著录项目、说明书正文和权利要求书几个核心区块。例如,申请号应作为唯一标识置于根元素下的第一层,而申请人、发明人等重复出现的实体适合用子元素列表表达,而不是拼成逗号分隔的字符串。
下面给出一个简化的XSD片段,用于规定专利根元素与必填字段。通过minOccurs控制必填性,用type限制数据类型,可以让上下游系统提前发现不合规数据。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="patent">
<xs:complexType>
<xs:sequence>
<xs:element name="application_number" type="xs:string" minOccurs="1"/>
<xs:element name="title" type="xs:string" minOccurs="1"/>
<xs:element name="applicants" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="applicant" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="claims" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
使用XSD而非仅靠文档说明,优势在于机器可校验。很多团队初期用Word写字段表,结果开发时各按各理解,后期联调才发现结构错位。把规则写成XSD,配合CI流水线做入站校验,能从源头堵住大部分格式问题。需要注意的是,XSD应尽量保持向后兼容,新增可选字段时不要改掉已有元素名称。
二、编码与命名空间的约定
中文专利名称、地址常引发乱码,根因多是发送方用了GBK而接收方按UTF-8读取。标准里应强制规定XML声明中的encoding为UTF-8,且传输层不再额外转码。对于包含特殊符号的化合物名称,直接放CDATA段比实体转义更易维护。
跨国交换时,元素重名会带来冲突。比如中美都用<kind>表示文献种类,但代码集不同。引入命名空间可隔离差异:一方用cnipr命名空间,一方用uspto命名空间,解析器就能准确区分。示例如下:
<patent xmlns:cn="http://ipipp.com/ns/cn" xmlns:us="http://ipipp.com/ns/us"> <cn:kind>A</cn:kind> <us:kind>B1</us:kind> <cn:application_number>202310000001.2</cn:application_number> </patent>
命名空间URL不一定可访问,它只是唯一标识符,但很多初学者误以为要部署网页。实际上写进xmlns的值只要格式像URI且不重复即可。若标准只在国内使用,也可约定统一前缀省略命名空间,但扩展性会变差。编码与命名空间确定后,应写进标准的第1节,作为所有示例的基础前提。
三、校验与对接的实践要点
即便有了XSD,实际数据仍可能日期写成2023-13-01、申请号缺校验位。因此标准要配套校验脚本,对业务规则做二次检查。下面用Python演示读取XML并验证申请号长度与日期格式:
import xml.etree.ElementTree as ET
from datetime import datetime
def validate_patent(xml_text):
root = ET.fromstring(xml_text)
app_num = root.find('application_number').text
if len(app_num) < 13:
raise ValueError('申请号长度不足')
date_text = root.find('filing_date').text
try:
datetime.strptime(date_text, '%Y-%m-%d')
except Exception:
raise ValueError('日期格式应为YYYY-MM-DD')
return True
xml_sample = '''<patent>
<application_number>202310000001.2</application_number>
<filing_date>2023-01-15</filing_date>
</patent>'''
print(validate_patent(xml_sample))
这类校验应前置到数据提交接口,而不是等批量导入报错再人工修。另一个常见坑是权利要求书里的上下标,XML里若不用专属元素而用纯文本,后续排版会丢失法律效力信息。标准应规定用<claim>包<dependent>等子元素表达引用关系。
综上,规范的XML专利数据标准不是写一份字段清单,而是用XSD锁结构、用UTF-8和命名空间消歧义、用业务校验补漏洞。团队在起草时多花两周对齐,比上线后每月处理脏数据更划算。