LabVIEW无原生XML解析器,需用MSXML COM(Windows)或JKI XML Toolkit(跨平台);Read From XML.vi仅支持LabVIEW专用.lvxml格式,无法解析通用XML。

LabVIEW 本身不提供原生的、开箱即用的 XML 解析器(如 Python 的 xml.etree.ElementTree 或 JavaScript 的 DOMParser),读写 XML 文件必须依赖外部机制——最常用且稳定的是调用 Windows 系统自带的 MSXML COM 对象,或使用第三方工具包(如 JKI XML Toolkit)。直接用 LabVIEW 基础 VI(如 Read From XML.vi)只能处理 LabVIEW 自己生成的、带类型信息的二进制 XML(.lvxml),不能解析通用 XML 文档。
用 MSXML COM 在 LabVIEW 中读取标准 XML 文件
这是 Windows 平台下最可靠的方式,适用于任意符合规范的 XML(如配置文件、Web API 返回体)。关键在于正确初始化 COM 对象并处理节点遍历。
-
MSXML2.DOMDocument60是推荐的版本(兼容 Win7–Win11,支持 XPath 和 UTF-8);避免用旧版Microsoft.XMLDOM - 必须在 VI 运行前调用
CoInitialize(LabVIEW 2013+ 通常自动处理,但多线程调用时需显式处理) - 加载失败时检查
parseError.errorCode和parseError.reason,常见错误包括编码不匹配(XML 声明是UTF-8但文件实际为ANSI)、路径含中文未转义、缺少根节点 - 读取文本内容时,用
text属性而非nodeValue(后者对元素节点返回空)
/* 示例:加载并读取 <config><port>5000</port></config> */
// 创建对象
DOM = CreateObject("MSXML2.DOMDocument60")
DOM.setProperty("SelectionLanguage", "XPath")
DOM.async = False
DOM.load("C:\config.xml")
<p>// 检查是否加载成功
if DOM.parseError.errorCode != 0:
errorMsg = DOM.parseError.reason
else:
portNode = DOM.selectSingleNode("/config/port")
portValue = portNode.text // ← 注意是 .text,不是 .nodeValue</p>用 MSXML COM 写入 XML 文件(生成新文件或修改后保存)
写入比读取更易出错,核心问题是字符编码和格式化。LabVIEW 默认保存为 UTF-16,但多数系统期望 UTF-8;且 MSXML 默认不自动缩进,生成的 XML 是“单行”不可读的。
- 写入前务必设置
DOM.setProperty("Charset", "UTF-8"),否则中文会乱码 - 用
DOM.save(filePath)保存,路径必须是完整绝对路径(相对路径常静默失败) - 若需美化输出(换行/缩进),需手动构建带
xml:space="preserve"的文本节点,或改用第三方工具包 - 修改已有 XML 时,先
load(),再用createElement/appendChild或selectSingleNode().text = newValue,最后save()
为什么不用 LabVIEW 自带的 Read From XML.vi?
因为这个 VI 只能反序列化 LabVIEW 特有的 XML 格式(由 Write To XML.vi 生成),其结构包含 <LVData> 根、类型描述(<Type>)、以及二进制 Base64 编码的值。它无法识别通用 XML 的标签名和结构,强行传入会报错 XML parsing error: Invalid document structure 或直接返回空簇。
- 如果你拿到的是服务器返回的
<user id="123"><name>Alice</name></user>,Read From XML.vi完全无法解析 - 该 VI 的输入类型必须严格匹配你定义的簇/类,无法动态提取字段
- 仅适合 LabVIEW 进程间传递数据,不适合与外部系统交互
跨平台或长期维护项目建议用 JKI XML Toolkit
如果项目需要运行在 Linux/macOS,或团队多人协作、XML 结构复杂(含命名空间、CDATA、属性混合),强烈建议安装开源的 JKI XML Toolkit(免费,NI Package Manager 可装)。它用纯 LabVIEW 实现,不依赖 COM,API 更贴近开发者直觉。
- 读取用
XML Parse to Variant.vi→ 返回 LabVIEW 变体,可直接转成簇或数组 - 写入用
XML Serialize from Variant.vi,支持encoding参数设为UTF-8 - 支持 XPath 查询、命名空间前缀绑定、自定义序列化规则
- 缺点:大型 XML(>10MB)解析稍慢于 MSXML,但对配置文件、API 响应完全够用
真正麻烦的从来不是“怎么读”,而是“怎么保证读出来的字符串编码对、节点路径没写错、空值有默认处理”。尤其当 XML 来自不同系统时,一个没声明 encoding 的文档就能让整个 VI 卡在 parseError 里半小时——建议所有 XML I/O 都包一层错误分支,并把原始字符串打日志,而不是只看 errorCode。










