moddle-xml的使用

170 阅读1分钟

首先定义moddle descriptor的json文件数据,例如:

{
  "name": "Cars",
  "uri": "http://cars",
  "prefix": "c",
  "types": [
    {
      "name": "Base",
      "properties": [
        {
          "name": "id",
          "type": "String",
          "isAttr": true
        }
      ]
    },
    {
      "name": "Root",
      "superClass": ["Base"],
      "properties": [
        {
          "name": "cars",
          "type": "Car",
          "isMany": true
        }
      ]
    },
    {
      "name": "Car",
      "superClass": ["Base"],
      "properties": [
        {
          "name": "name",
          "type": "String",
          "isAttr": true,
          "default": "No Name"
        },
        {
          "name": "similar",
          "type": "Car",
          "isMany": true,
          "isReference": true
        },
        {
          "name": "engine",
          "type": "Engine"
        }
      ]
    },
    {
      "name": "Engine",
      "superClass": ["Base"],
      "properties": [
        {
          "name": "power",
          "type": "Integer",
          "isAttr": true
        },
        {
          "name": "fuelConsumption",
          "type": "Integer",
          "isAttr": true
        }
      ]
    }
  ]
}

安装相关依赖包moddle,moddle-xml,

import { Moddle } from "moddle";
import { Reader, Writer } from "moddle-xml";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const carsJSON = require("./car.json");

const model = new Moddle([carsJSON]);

const xml = `<c:Root xmlns:c="http://cars"><c:Car id="Car_1">
        <c:Engine power="121" fuelConsumption="10"></c:Engine>
    </c:Car>
</c:Root>
`;

const reader = new Reader(model);
const rootHandler = reader.handler("c:Root");

try {
    const { rootElement: cars, warnings } = await reader.fromXML(
        xml,
        rootHandler
    );

    if (warnings.length) {
        console.log("import warnings", warnings);
    }

    console.log(cars);
} catch (err) {
    console.log("import error", err, err.warnings);
}

var cars2 = model.create('c:Root')
cars2.get('cars').push(model.create('c:Car', { power: 10 }))
var options = { format: false, preamble: false }
var writer = new Writer(options)

var xml2 = writer.toXML(cars2);
console.log(xml2)