如何消除OpenEdge Progress中XML输出重复的NAMESPACE-URI
我使用带DATA-RELATION的TEMP-TABLE和WRITE-XML函数生成XML文件时,发现命名空间URI同时出现在文档头部和第一个数据标签<CstmrCdtTrfInitn>中:
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrCdtTrfInitn
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
期望仅在文档头部保留命名空间,第一个数据标签不再重复:
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<CstmrCdtTrfInitn>
当前数据集定义代码:
DEFINE DATASET Document NAMESPACE-URI "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" FOR CstmrCdtTrfInitn, GrpHdr, InitgPty, Id, OrgId, Othr, Purp, PmtInf, PmtTpInf, SvcLvl, ReqdExctnDt, LclInstrm, Dbtr, DbtrAcct, Id-DbtrAct, Othr-DbtrAct, DbtrAgt, FinInstnId, ClrSysMmbId, ClrSysId, PstlAdr-DbtrAgt, CdtTrfTxInf, PmtId, Amt, InstdAmt, CdtrAgt, FinInstnId-CR, ClrSysMmbId-CR, Cdtr, CdtrAcct, Id-CR, PstlAdr, PstlAdr-CR, PstlAdr-Cdtr, Othr-CI, Othr-CAgt, Id-Dbtr, OrgId-Dbtr, Othr-Dbtr, SchmeNm DATA-RELATION XML-1 FOR CstmrCdtTrfInitn, GrpHdr RELATION-FIELDS(MsgId, MsgId) NESTED
要解决命名空间重复声明的问题,按以下步骤操作:
移除顶层临时表的独立命名空间声明
检查顶层临时表CstmrCdtTrfInitn的定义,如果它单独配置了NAMESPACE-URI属性,必须删除该配置。只需保留DATASET级别的NAMESPACE-URI定义即可,根元素会自动继承数据集的命名空间,无需重复声明。调整WRITE-XML调用参数
调用WRITE-XML时使用正确的参数组合,避免触发额外的命名空间声明,示例代码如下:DATASET Document:WRITE-XML( "FILE", "output.xml", TRUE, /* 开启格式化输出 */ ?, /* 使用默认编码 */ ?, /* 不指定样式表 */ ?, /* 默认使用顶层表名作为根元素 */ "UTF-8", FALSE /* 不启用NO-TOP-ELEMENT,保留顶层表作为根节点 */ ).确认数据关系配置
现有DATA-RELATION的NESTED属性配置正确,嵌套关系不会强制根元素重新声明命名空间,无需修改。
完成以上操作后,生成的XML将仅在文档头部保留命名空间声明,根元素<CstmrCdtTrfInitn>不会重复出现命名空间属性。
内容的提问来源于stack exchange,提问作者JSS

