【仓颉三方库】 数据封装传递——【xml-ffi 】

98 阅读3分钟

介绍

一个标准的 XML 文本处理的工具。

特性

  • 🚀 支持Xml DOM 解析模式

  • 🚀 支持Xml SAX 解析模式

软件架构

架构图

源码目录

.
├── README.md
├── doc 
├── libxml_c
├── src
│   ├── native.cj  
│   └── XmlParser.cj    
│       
├── test
│    ├── DOC
│    ├── FUZZ
│    ├── HLT
│    ├── LLT
│    └── UT
├── CHANGELOG.md
├── LICENSE.txt
├── module.json
├── README.md
├── README.OpenSource

  • doc 文档目录,用于存API接口文档
  • libxml_c 需要自行编译的c文件
  • src 是库源码目录
  • test 存放 HLT 测试用例、LLT 自测用例、DOC 示例用例、FUZZ用例、UT 单元测试用例

接口说明

主要是核心类和成员函数说明,详情见 API

使用说明

编译

libxml2 编译

  1. linux 编译

进入 libxml2 根目录,执行下面语句。

    var=`awk '/set_target_properties.*/{print NR;exit;}' CMakeLists.txt` && sed -i ''"$var"',+10{/VERSION/d}' CMakeLists.txt

1.1 x86-64

    cmake ./ -DCMAKE_BUILD_TYPE=Release
    make

1.2 aarch64

    cmake ./ -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -D LIBXML2_WITH_ICONV=OFF -D LIBXML2_WITH_LZMA=OFF -D LIBXML2_WITH_PYTHON=OFF -D LIBXML2_WITH_ZLIB=OFF
    make

2. winows 编译

下载msys2和mingw64

msys2:github.com/msys2/msys2…

mingw64:github.com/niXman/ming…

将mingw64解压到msys2的根目录

下载cmake:github.com/Kitware/CMa…

将cmake解压到D盘

用mingw64进入libxml2目录,执行下面语句

    pacman -S liblzma-devel zlib-devel
    "D:\cmake-3.26.3-windows-x86_64\bin\cmake" ./ -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
    make

3. ohos 编译

用mingw64进入libxml2目录,执行下面语句

xx/xx/native 为ohos编译工具链目录

    var=`awk '/set_target_properties.*/{print NR;exit;}' CMakeLists.txt` && sed -i ''"$var"',+10{/VERSION/d}' CMakeLists.txt
    mkdir build
    cd build
    cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER="xx/xx/native/llvm/bin/clang.exe" -DCMAKE_C_FLAGS="--sysroot=xx/xx/native/sysroot --target=aarch64-linux-ohos" -DCMAKE_SYSTEM_NAME=linux -DCMAKE_SYSTEM_PROCESSOR=aarch64  -G "MinGW Makefiles" -DCMAKE_STRIP="xx/xx/native/llvm/bin/llvm-strip.exe" -DCMAKE_MAKE_PROGRAM="xx/msys2/mingw64/bin/make.exe" -D LIBXML2_WITH_ICONV=OFF -D LIBXML2_WITH_LZMA=OFF -D LIBXML2_WITH_PYTHON=OFF -D LIBXML2_WITH_ZLIB=OFF
    make

xml4cj编译

  1. linux x86_64 编译

将上面生成文件 libxml2.so,放入根目录的 lib 文件夹下,之后执行

    ./build_linux.sh

2. windows 编译

将上面生成文件 libxml2.dll,放入根目录的 lib 文件夹下,之后执行

    build_windows.bat

3. aarch64编译

将上面生成文件 libxml2.so,放入根目录的 lib 文件夹下,之后执行

    ./build_aarch64.sh

4. ohos编译

将上面生成文件 libxml2.so,放入根目录的 lib 文件夹下,之后执行

    ./build_ohos.sh

功能示例

Xml DOM 解析模式功能示例

import xml4cj.*

main() {
    let x: XmlParser = XmlParser()

    var ret = x.parse("<myxml>Some data </myxml>")
    match (ret) {
        case Some(root) => println(root.name)
        case None => println("XML Parse error.")
    }
    return 0
}

执行结果如下:

myxml

DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。

`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

Xml SAX 解析模式功能示例

import xml4cj.*
import std.collection.*

let latestMovie = """
<collection shelf="New Arrivals">
<movie title="Movie 2021">
   <score>7.4</score>
   <year>2021-3</year>
   <description>This is a virtual film released in 2021 for testing.</description>
</movie>
<movie title="Movie 2022">
   <type>Anime, Science Fiction</type>
   <score>7</score>
   <year>2022-2</year>
   <description>This is a virtual film released in 2022 for testing.</description>
</movie>
<movie title="Movie 2023">
   <score>6.5</score>
   <year>2023-4</year>
   <description>This is a virtual film released in 2023 for testing.</description>
</movie>
</collection>
"""
class MovieHandler <: SaxHandler {
    private var curTag: String
    private var title: String
    private var score: String
    private var year: String

    init() {
        curTag = ""
        title = ""
        score = ""
        year = ""
    }

    public func startDocument(): Unit {
        println("Start Parsing.")
    }
    public func endDocument(): Unit {
        println("End Parsing.")
    }
    public func startElement(name: String, attrs: ArrayList<XmlAttr>): Unit {
        curTag = name
        if (name == "movie") {
            title = attrs[0].content
            println("Title: ${title}")
        }
    }
    public func endElement(name: String): Unit {
        if (curTag == "score") {
            println("Score: ${score}")
        } else if (curTag == "year") {
            println("Year: ${year}")
        }
    }
    public func characters(content: String): Unit {
        if (curTag == "score") {
            score = content
        } else if (curTag == "year") {
            year = content
        }
    }
}
main() {
    var handler = MovieHandler()
    let x: XmlParser = XmlParser(handler)

    x.parse(latestMovie)
    return 0
}

执行结果如下:

Start Parsing.
Title: Movie 2021
Score: 7.4
Year: 2021-3
Title: Movie 2022
Score: 7
Year: 2022-2
Title: Movie 2023
Score: 6.5
Year: 2024-4
End Parsing.