# JSON Schema 到 XML CSDL 转换工具

## 功能说明

本工具用于将 Redfish OEM JSON Schema 文件转换为 XML CSDL (Common Schema Definition Language) 格式，主要用于 Redfish 接口的元数据定义。

### 主要特性

- **格式转换**：将 JSON Schema 格式转换为符合 OData CSDL 标准的 XML 格式
- **批量处理**：支持单个文件转换或整个目录的批量转换
- **智能合并**：如果目标 XML 文件已存在，自动合并新的 Schema 定义
- **类型支持**：
  - 枚举类型 (EnumType)
  - 复杂类型 (ComplexType)
  - 实体类型 (EntityType)
  - 导航属性 (NavigationProperty)
- **元数据提取**：自动从 JSON 文件中提取命名空间、版本、版权等元数据
- **注解生成**：自动生成描述、权限、验证规则等 OData 注解

## 使用说明

### 基本语法

```bash
python3 json_to_csdl.py --input <input_dir> --output <output_dir>
```

### 参数说明

- `--input`: 输入目录（包含 JSON schema 文件）
- `--output`: 输出目录（可选，默认为输入目录）

### 使用示例

#### 1. 转换单个目录

```bash
python3 json_to_csdl.py --input /path/to/json_schemas --output /path/to/xml_output
```

#### 2. 使用默认输出目录

```bash
# 输出目录与输入目录相同
python3 json_to_csdl.py --input /path/to/json_schemas
```

#### 3. 实际应用示例

```bash
python3 json_to_csdl.py \
  --input /redfish/v1/schemastore/en/oem/huawei/json_schema/ \
  --output /redfish/v1/schemastore/en/oem/huawei/csdl
```

## 文件命名规则

工具会自动生成输出文件名：
- 输入：`oemaccountservice.v1_0_0.json`
- 输出：`oemaccountservice_v1.xml`

## 支持的 JSON Schema 结构

### 顶层定义

工具会处理 JSON Schema 中的以下定义：
- **枚举定义**：包含 `enum` 字段且 `type` 为 `string` 的定义
- **复杂类型**：包含 `properties` 的对象类型定义
- **实体类型**：主定义（通过 `$ref` 引用的定义）
- **Action 定义**：包含 `title` 和 `target` 属性的定义

### 属性类型映射

| JSON 类型 | CSDL 类型 |
|----------|----------|
| string | Edm.String |
| integer | Edm.Int32 |
| number | Edm.Double |
| boolean | Edm.Boolean |
| array | Collection(...) |
| enum | 自定义枚举类型 |

### 引用处理

- **内部引用**：`#/definitions/XXX` 转换为命名空间限定类型
- **外部引用**：自动解析 DMTF 标准引用（如 Resource.json）

## 输出 XML 结构

生成的 XML 文件包含：

```xml
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <!-- 引用标准 Schema -->
  <edmx:Reference Uri="...">
    <edmx:Include Namespace="..." />
  </edmx:Reference>

  <edmx:DataServices>
    <!-- 不带版本号的 Schema（基文件） -->
    <Schema xmlns="..." Namespace="OemAccountService">
      <EntityType Name="OemAccountService" Abstract="true">
        ...
      </EntityType>
    </Schema>

    <!-- 带版本号的 Schema（完整定义） -->
    <Schema xmlns="..." Namespace="OemAccountService.v1_0_0">
      <EnumType Name="XXXType">...</EnumType>
      <ComplexType Name="YYY">...</ComplexType>
      <EntityType Name="OemAccountService">...</EntityType>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>
```

## 注意事项

1. **文件合并**：如果目标 XML 文件已存在且包含相同命名空间，新定义会被合并到现有文件中
2. **目录清空**：批量转换时会清空输出目录中的现有xml文件
3. **编码格式**：所有文件使用 UTF-8 编码

## 依赖要求

- Python 3.6+
- 标准库：json, xml.etree.ElementTree, xml.dom.minidom, pathlib, re
