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
相关产品推荐
相关产品推荐

