2. CHI XML 基础语法:XML 节点定义、属性与值、命名空间、常见 Schema 约束
CHI (Camera Hardware Interface) 架构的配置核心是 XML 文件。这些 XML 文件定义了从传感器输入到最终图像输出的完整管线链路。理解 CHI XML 的基础语法,是进行参数调优的前提。本章将系统讲解 XML 节点定义、属性与值、命名空间以及常见的 Schema 约束,帮助您建立扎实的配置基础。
2.1 XML 节点定义与层级结构
在 CHI XML 中,所有配置信息都以节点(Element)的形式组织。节点是 XML 文档的基本构建块,通过嵌套形成树状层级结构。每个节点代表一个具体的配置对象,例如一个传感器、一个管线或一个算法模块。
核心概念: CHI XML 的根节点通常是
<CHI>,其下包含 <Sensor>、<Pipeline>、<Node> 等子节点。每个子节点又可以包含更细粒度的配置项。
节点定义的基本语法如下:
<节点名 属性1="值1" 属性2="值2">
<子节点名>文本内容</子节点名>
<空节点名 属性="值"/>
</节点名>
最佳实践: 在编写 CHI XML 时,建议每个节点缩进 2 个空格,保持层级清晰。空节点(无子节点和文本内容)应使用自闭合格式
<NodeName/>,减少文件冗余。
2.2 属性与值的定义规则
属性(Attribute)为节点提供额外的配置信息。在 CHI XML 中,属性通常用于指定节点的关键参数,如 ID、类型、名称等。属性值必须用双引号或单引号包裹。
| 属性类型 | 示例 | 说明 |
|---|---|---|
| 字符串 | Name="IMX586" |
用于标识名称、描述等文本信息 |
| 整数 | Width="1920" |
用于分辨率、索引、计数等数值 |
| 浮点数 | FPS="30.0" |
用于帧率、增益、时间等小数参数 |
| 枚举 | Format="NV12" |
从预定义集合中选择的值 |
| 布尔 | Enable="true" |
用于开关控制,值为 true/false |
| 十六进制 | Address="0x4A" |
用于寄存器地址、掩码等 |
以下是一个典型的 CHI XML 节点属性使用示例:
<Sensor Name="IMX586" Type="RAW" I2CAddress="0x1A">
<Resolution Width="1920" Height="1080"/>
<FrameRate Min="10.0" Max="30.0" Default="30.0"/>
<StreamConfig Format="NV12" Enable="true"/>
</Sensor>
常见错误: 属性值中不能直接包含
< 或 > 字符。如果需要使用,请使用预定义实体引用:< 表示 <,> 表示 >。另外,属性名不能以数字开头,且不能包含空格。
2.3 命名空间(Namespace)
命名空间用于避免 XML 元素名称冲突。在 CHI 配置中,命名空间主要用于区分不同模块或供应商的自定义配置。CHI XML 通常使用默认命名空间和前缀命名空间两种方式。
命名空间声明通常放在根节点中:
<CHI xmlns="http://www.qualcomm.com/chi"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.qualcomm.com/chi chi_schema.xsd">
<!-- 配置内容 -->
</CHI>
关键点: 在 CHI 配置中,
xmlns:xsi 是 W3C 标准命名空间,用于关联 Schema 约束。xsi:schemaLocation 属性告诉解析器到哪里寻找 Schema 文件进行验证。正确使用命名空间可以避免不同模块间的属性名冲突。
2.4 常见 Schema 约束
XML Schema(XSD)用于定义 XML 文档的结构、数据类型和约束规则。CHI 配置使用 Schema 来确保 XML 文件的合法性和一致性。常见的 Schema 约束包括:
| 约束类型 | XSD 示例 | 作用 |
|---|---|---|
| 元素顺序 | <xs:sequence> |
规定子节点必须按指定顺序出现 |
| 出现次数 | minOccurs="0" maxOccurs="unbounded" |
控制节点最少/最多出现次数 |
| 数据类型 | type="xs:integer" |
限制属性或文本内容的数据类型 |
| 枚举值 | <xs:enumeration value="NV12"/> |
限定属性只能取特定值 |
| 正则表达式 | pattern="[0-9]+" |
通过正则模式匹配值格式 |
| 唯一约束 | <xs:unique> |
确保某个属性或值在指定范围内唯一 |
以下是一个简化的 CHI Schema 片段,展示了如何约束 <Sensor> 节点:
<xs:element name="Sensor">
<xs:complexType>
<xs:sequence>
<xs:element name="Resolution" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="Width" type="xs:integer" use="required"/>
<xs:attribute name="Height" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="FrameRate" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="RAW"/>
<xs:enumeration value="YUV"/>
<xs:enumeration value="JPEG"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
调优提示: 在修改 CHI XML 时,建议始终使用 Schema 验证工具(如 xmllint)检查文件合法性。常见的错误包括:必填属性缺失、枚举值拼写错误、节点顺序颠倒。这些错误会导致管线加载失败或运行时异常。
2.5 节点定义与 Schema 约束的对应关系
理解节点定义与 Schema 约束之间的对应关系,有助于快速定位配置问题。下表总结了常见节点定义与 Schema 约束的映射:
| XML 节点定义 | Schema 约束 | 验证规则 |
|---|---|---|
<Sensor Name="IMX586"/> |
attribute Name required |
Name 属性必须存在且为字符串 |
<Resolution Width="1920" Height="1080"/> |
element Resolution, attributes integer |
Width 和 Height 必须为正整数 |
<StreamConfig Format="NV12"/> |
enumeration NV12, YUYV, ... |
Format 值必须在枚举列表中 |
<NodePort Id="0" Direction="Input"/> |
attribute Id unique, Direction enum |
Id 在父节点内唯一,Direction 为 Input/Output |
<Property Key="test" Value="123"/> |
pattern for Value |
Value 必须匹配正则表达式(如数字格式) |
2.6 常见语法错误与调试技巧
在编写 CHI XML 时,以下错误最为常见。掌握这些错误的排查方法,可以大幅提高配置效率。
- 标签未闭合: 如
<Sensor>...</Sensor>写成<Sensor>...</Sensr>,导致解析失败。 - 属性值未加引号: 如
Width=1920必须写成Width="1920"。 - 特殊字符未转义: 属性值中包含
&时,应使用&。 - 节点顺序错误: Schema 要求
<Resolution>必须在<FrameRate>之前,但实际顺序颠倒。 - 枚举值拼写错误: 如将
NV12写成Nv12,大小写不匹配。
调试建议: 使用支持 XML 语法高亮和 Schema 验证的编辑器(如 VS Code + XML 插件)。在提交配置前,务必运行
xmllint --schema chi_schema.xsd config.xml 进行验证。如果验证失败,解析器通常会给出具体的行号和错误描述,这是定位问题的第一线索。