OpenEdge Progress 4GL WRITE-XML NAMESPACE-PREFIX

时间:2018-08-22 16:49:11

标签: openedge progress-4gl 4gl

您好,OpenEdge开发人员,

我正在使用以下语法从临时表生成XML文件。一切都很好,但只有一件。

dataset dsCust:write-xml("FILE", "c:/Test/Customer.xml", true).

这是我的临时表声明

def temp-table ttCustomer no-undo         
  namespace-uri "http://WMS.URI"
  namespace-prefix "ns0"
  field PurchaseOrderNumber       as char
  field Plant                     as char.

这是我的输出

<ns0:GoodsReceipt xmlns:ns0="http://WMS.URI">
     <ns0:PurchaseOrderNumber/>
     <ns0:Plant>Rose</ns0:Plant>
</ns0:GoodsReceipt>

但这是我想要的输出

<ns0:GoodsReceipt xmlns:ns0="http://WMS.URI">
     <PurchaseOrderNumber/>
     <Plant>Rose</Plant>
</ns0:GoodsReceipt>

请注意,GoodsReceipt节点内的元素没有ns0前缀。 可以使用write-xml实现吗?我想尽可能避免使用DOM或SAX。

谢谢

2 个答案:

答案 0 :(得分:3)

您始终可以使用XML-NODE-TYPESERIALIZE-NAME手动设置属性和标记名。

但是:我已经将许多xml:s和API:s与Progress OpenEdge一起使用,并且尚未因命名空间问题而失败,但是我想这可能取决于您想对数据做些什么。

由于您没有包括整个数据集,所以这是一个猜测。对于这种特定情况,它或多或少会产生您想要的东西。我不知道应该渲染多个“收据”,所以您可能需要更改它。

DEFINE TEMP-TABLE ttCustomer NO-UNDO SERIALIZE-NAME "ns0:GoodsReceipt"
    FIELD xmlns               AS CHARACTER SERIALIZE-NAME "xmlns:ns0" INITIAL "http://WMS.URI" XML-NODE-TYPE "ATTRIBUTE"
    FIELD PurchaseOrderNumber AS CHARACTER 
    FIELD Plant               AS CHARACTER .

DEFINE DATASET dsCust SERIALIZE-HIDDEN
    FOR ttCustomer .

CREATE ttCustomer.
ASSIGN Plant = "Rose".

DATASET dsCust:write-xml("FILE", "c:/temp/Customer.xml", TRUE).

答案 1 :(得分:0)

从关于这个问题的快速Google看来,W3C建议以OpenEdge的方式显示名称空间前缀:https://www.w3schools.com/xml/xml_namespaces.asp 而且我敢肯定,您无法像希望的那样使用write-xml更改行为。该文档没有提及任何替代行为的方法。 https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvxml/namespace-uri-and-namespace-prefix.html