libexpat/libexpat

GitHub: libexpat/libexpat

一个用 C99 编写的高性能流式 XML 解析库,以事件回调方式高效解析 XML 1.0 文档。

Stars: 1345 | Forks: 516

[![运行 Linux CI 任务](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/01d6a6cbf2003017.svg)](https://github.com/libexpat/libexpat/actions/workflows/linux.yml) [![打包状态](https://repology.org/badge/tiny-repos/expat.svg)](https://repology.org/metapackage/expat/versions) [![SourceForge 下载量](https://img.shields.io/sourceforge/dt/expat?label=Downloads%20SourceForge)](https://sourceforge.net/projects/expat/files/) [![GitHub 下载量](https://img.shields.io/github/downloads/libexpat/libexpat/total?label=Downloads%20GitHub)](https://github.com/libexpat/libexpat/releases) [![OpenSSF 最佳实践](https://www.bestpractices.dev/projects/10205/badge)](https://www.bestpractices.dev/projects/10205) # Expat,Release 2.8.1 这是 Expat,一个用于解析 [XML 1.0 第四版](https://www.w3.org/TR/2006/REC-xml-20060816/) 的 C99 库,由 [James Clark](https://en.wikipedia.org/wiki/James_Clark_%28programmer%29) 于 1997 年发起。 Expat 是一个面向流的 XML parser。这意味着在开始解析之前,你需要向 parser 注册 handler。当 parser 在解析的文档中发现相关结构时,就会调用这些 handler。起始标签(start tag)就是你可以为其注册 handler 的一种结构示例。 Expat 支持以下 C99 编译器: - GNU GCC >=4.5(供 C 语言使用)或 GNU GCC >=4.8.1(供 C++ 使用) - LLVM Clang >=3.5 - Microsoft Visual Studio >=17.0/2022 ([官方 GitHub Actions Windows 镜像](https://github.com/actions/runner-images) 支持的最低版本) Windows 用户可以使用 [`expat-win32bin-*.*.*.{exe,zip}` 下载包](https://github.com/libexpat/libexpat/releases), 其中包含预编译的库和可执行文件,以及供开发者使用的源代码。 Expat 是[自由软件](https://www.gnu.org/philosophy/free-sw.en.html)。 你可以根据本包中分发的 [`COPYING`](https://github.com/libexpat/libexpat/blob/master/expat/COPYING) 文件中包含的许可证条款对其进行复制、分发和修改。 该许可证与 MIT/X Consortium 许可证相同。 ## 在基于 CMake 的项目中使用 libexpat 有三种官方文档记录的方式来配合 CMake 使用 libexpat: ### a) Module 模式下的 `find_package` 这种方法利用了 CMake 自带的 [模块 `FindEXPAT`](https://cmake.org/cmake/help/latest/module/FindEXPAT.html)。 请注意以下示例中**大写**的 `EXPAT`: ``` cmake_minimum_required(VERSION 3.10) project(hello VERSION 1.0.0) find_package(EXPAT 2.2.8 MODULE REQUIRED) add_executable(hello hello.c ) target_link_libraries(hello PUBLIC EXPAT::EXPAT) ``` ### b) Config 模式下的 `find_package` 此方法需要来自以下版本的文件…… - 使用 CMake 构建系统打包的 libexpat >=2.2.8 或 - Linux 上使用 GNU Autotools 构建系统打包的 libexpat >=2.3.0 或 - macOS 或 MinGW 上使用 GNU Autotools 构建系统打包的 libexpat >=2.4.0 请注意以下示例中**小写**的 `expat`: ``` cmake_minimum_required(VERSION 3.10) project(hello VERSION 1.0.0) find_package(expat 2.2.8 CONFIG REQUIRED char dtd ns) add_executable(hello hello.c ) target_link_libraries(hello PUBLIC expat::expat) ``` ### c) `FetchContent` 模块 下面演示的这种方法要求 CMake >=3.18,以确保可以使用 [`FetchContent` 模块](https://cmake.org/cmake/help/latest/module/FetchContent.html) 及其对 `SOURCE_SUBDIR` 选项的支持。 请注意: - 不建议将 `FetchContent` 模块与 libexpat 的*非发布版* SHA1 或 `master` 分支结合使用,这也不被视为官方支持。 - 锁定到特定的 commit 非常适合用于稳健的 CI。 - 每次发布 libexpat 新版本时,都需要手动或通过自动化方式更新锁定的 commit,以免错过 libexpat 的安全更新。 以下是通过 Git 拉取 libexpat 的示例: ``` cmake_minimum_required(VERSION 3.18) include(FetchContent) project(hello VERSION 1.0.0) FetchContent_Declare( expat GIT_REPOSITORY https://github.com/libexpat/libexpat/ GIT_TAG 000000000_GIT_COMMIT_SHA1_HERE_000000000 # i.e. Git tag R_X_Y_Z SOURCE_SUBDIR expat/ ) FetchContent_MakeAvailable(expat) add_executable(hello hello.c ) target_link_libraries(hello PUBLIC expat) ``` ## 从 Git 克隆构建 如果你是通过 [Git 仓库](https://github.com/libexpat/libexpat/) 的 check-out 来构建 Expat, 你需要运行一个脚本,使用 GNU autoconf 和 libtool 工具生成 configure 脚本。为此,你需要安装 autoconf 2.58 或更高版本。按如下方式运行该脚本: ``` ./buildconf.sh ``` 完成此操作后,请按照与从源码分发包构建相同的说明进行操作。 ## 从源码分发包构建 ### a) 使用 configure 脚本构建(即 GNU Autotools) 要从源码分发包构建 Expat,首先需要运行顶级分发目录中的配置 shell 脚本: ``` ./configure ``` 你可以为 configure 提供许多选项(可以通过运行带有 `--help` 选项的 configure 来发现这些选项)。但最令人感兴趣的是设置安装目录的选项。默认情况下,configure 脚本会将 libexpat 安装到 `/usr/local/lib`,将 `expat.h` 安装到 `/usr/local/include`,并将 `xmlwf` 安装到 `/usr/local/bin`。例如,如果你希望将其安装到 `/home/me/mystuff/lib`、`/home/me/mystuff/include` 和 `/home/me/mystuff/bin`,你可以通过以下方式告知 `configure`: ``` ./configure --prefix=/home/me/mystuff ``` 另一个有趣的选项是为行号和列号以及总字节索引启用 64 位整数支持: ``` ./configure CPPFLAGS=-DXML_LARGE_SIZE ``` 然而,这种修改将是对 ABI 的破坏性更改,因此不建议在常规用途中使用 — 例如作为 Linux 发行版的一部分 — 而仅适用于有特殊要求的构建。 运行 configure 脚本后,可以使用 `make` 命令进行构建,并使用 `make install` 将其安装到正确的位置。请查看 `Makefile` 以了解其他 `make` 选项。请注意,你需要对这些安装目录具有写入权限。 如果你希望构建出的 Expat 提供 UTF-16 编码(而非默认的 UTF-8 编码)的文档信息,请按照以下说明操作(在运行 `make distclean` 之后)。 请注意,我们配置了 `--without-xmlwf`,因为 xmlwf(目前)不支持这种编译模式: 1. 批量修改 `Makefile.am` 文件,将库名称更改为 `libexpatw.la`:
`find . -name Makefile.am -exec sed -e 's,libexpat\.la,libexpatw.la,' -e 's,libexpat_la,libexpatw_la,' -i.bak {} +` 2. 运行 `automake` 重写 `Makefile.in` 文件:
`automake` 3. 若要以 unsigned short 形式输出 UTF-16(且版本/错误字符串仍为 char), 请运行:
`./configure CPPFLAGS=-DXML_UNICODE --without-xmlwf`
若要以 `wchar_t` 形式输出 UTF-16(包含版本/错误字符串),请运行:
`./configure CFLAGS="-g -O2 -fshort-wchar" CPPFLAGS=-DXML_UNICODE_WCHAR_T --without-xmlwf`
注意:后者还需要使用 `-fshort-wchar` 编译的 libc。 4. 运行 `make`(排除了 xmlwf)。 5. 运行 `make install`(同样排除了 xmlwf)。 支持使用 `DESTDIR`。其工作方式如下: ``` make install DESTDIR=/path/to/image ``` 这会覆盖在 Makefile 中设置的 `DESTDIR`,因为变量设置的优先级为: 1. 命令行 2. Makefile 内部 3. 环境变量 注意:这仅适用于 Expat 库本身,目前不支持构建 UTF-16 版本的 xmlwf 和测试。 本分发包中的 `doc/reference.html` 文件提供了参考手册。 ### b) 使用 CMake 构建 CMake 构建系统仍处于*实验性*阶段,等其完善后,可能会在某个时候取代基于 GNU Autotools 的主要构建系统。 #### 可用选项 要了解使用 CMake 构建的可用(非高级)选项,请参考: ``` # rm -f CMakeCache.txt ; cmake -D_EXPAT_HELP=ON -LH . | grep -B1 ':.*=' | sed 's,^--$,,' // Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ... CMAKE_BUILD_TYPE:STRING= // Install path prefix, prepended onto install directories. CMAKE_INSTALL_PREFIX:PATH=/usr/local // Path to a program. DOCBOOK_TO_MAN:FILEPATH=/usr/bin/docbook2x-man // Build man page for xmlwf EXPAT_BUILD_DOCS:BOOL=ON // Build the examples for expat library EXPAT_BUILD_EXAMPLES:BOOL=ON // Build fuzzers for the expat library EXPAT_BUILD_FUZZERS:BOOL=OFF // Build pkg-config file EXPAT_BUILD_PKGCONFIG:BOOL=ON // Build the tests for expat library EXPAT_BUILD_TESTS:BOOL=ON // Build the xmlwf tool for expat library EXPAT_BUILD_TOOLS:BOOL=ON // Character type to use (char|ushort|wchar_t) [default=char] EXPAT_CHAR_TYPE:STRING=char // Install expat files in cmake install target EXPAT_ENABLE_INSTALL:BOOL=ON // Use /MT flag (static CRT) when compiling in MSVC EXPAT_MSVC_STATIC_CRT:BOOL=OFF // Build a shared expat library EXPAT_SHARED_LIBS:BOOL=ON // Define to provide symbol versioning for dependency generation EXPAT_SYMBOL_VERSIONING:BOOL=OFF // Treat all compiler warnings as errors EXPAT_WARNINGS_AS_ERRORS:BOOL=OFF ```
标签:Bash脚本, C99, SOC Prime, XML解析器, 基础库, 客户端加密, 开发工具, 流式解析