You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenEdge read-xml报错:XML中未找到对应命名空间的数据集

问题:Progress OpenEdge读取带命名空间的XML到Dataset报错

场景与问题

目标XML内容:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Message xmlns:ns1="http://API.JOEJANE.Envelope">
  <ns1:MessageHeader>
    <ns1:MessageId>ce82fe4f-c843-57a6-14a1-15d79773b638</ns1:MessageId>
    <ns1:From>ABC</ns1:From>
    <ns1:To>JOEJANE</ns1:To>
    <ns1:PlantId>7301</ns1:PlantId>
  </ns1:MessageHeader>
</ns1:Message>

尝试用以下代码读取到Dataset:

def temp-table ttMsgHdr no-undo serialize-name "ns1:MessageHeader"
  field MsgId   as char         serialize-name "ns1:MessageId"
  field MsgFrom as char         serialize-name "ns1:From"
  field MsgTo   as char         serialize-name "ns1:To"
  field PlantId as char         serialize-name "ns1:PlantId".

def dataset dsONE  xml-node-name    "ns1:Message"   for
  ttMsgHdr.

def var dXml as longchar.

dataset dsONE:read-xml("longchar",dXml,"empty",?,?,?,?).

find first ttMsgHdr no-error.

执行后报错:

DATASET name 'ns1:Message' in namespace '' not found in XML Document.

尝试修改xml-node-name为空白、拼接命名空间声明等,均无法解决。

解决方案

报错核心是未正确关联XML的命名空间URI,仅使用前缀ns1:无法让OpenEdge识别对应的命名空间。以下两种方法均可解决:

方法1:在Dataset和TempTable定义中指定命名空间

直接为Dataset和TempTable添加xml-namespace属性,关联XML中的命名空间URI,同时可以简化serialize-name和xml-node-name为本地名称:

def temp-table ttMsgHdr no-undo 
    xml-namespace "http://API.JOEJANE.Envelope"
    serialize-name "MessageHeader"
    field MsgId   as char         serialize-name "MessageId"
    field MsgFrom as char         serialize-name "From"
    field MsgTo   as char         serialize-name "To"
    field PlantId as char         serialize-name "PlantId".

def dataset dsONE  
    xml-namespace "http://API.JOEJANE.Envelope"
    xml-node-name "Message"   
    for ttMsgHdr.

def var dXml as longchar.

// 确保dXml已赋值为目标XML内容
dataset dsONE:read-xml("longchar", dXml, "empty", ?, ?, ?, ?).

find first ttMsgHdr no-error.

方法2:在read-xml调用中传递命名空间映射

保留原有Dataset和TempTable的前缀写法,在调用read-xml时通过第6个参数传递命名空间映射:

def temp-table ttMsgHdr no-undo serialize-name "ns1:MessageHeader"
  field MsgId   as char         serialize-name "ns1:MessageId"
  field MsgFrom as char         serialize-name "ns1:From"
  field MsgTo   as char         serialize-name "ns1:To"
  field PlantId as char         serialize-name "ns1:PlantId".

def dataset dsONE  xml-node-name    "ns1:Message"   for
  ttMsgHdr.

def var dXml as longchar.

// 传递命名空间映射:前缀=URI
dataset dsONE:read-xml("longchar", dXml, "empty", ?, ?, "ns1=http://API.JOEJANE.Envelope", ?).

find first ttMsgHdr no-error.

说明

OpenEdge处理带命名空间的XML时,必须明确关联前缀对应的命名空间URI,仅使用前缀无法让系统定位到XML中的目标元素。两种方法本质都是建立前缀与URI的关联,任选其一即可。

内容的提问来源于stack exchange,提问作者BobNoobGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:35:24