OpenEdge Progress 4GL WRITE-XML NAMESPACE-PREFIX
OpenEdge Progress 4GL WRITE-XML NAMESPACE-PREFIX
您好,OpenEdge 开发人员,
我正在使用以下语法从临时 table 生成一个 XML 文件。除了一个项目,一切都很好。
dataset dsCust:write-xml("FILE", "c:/Test/Customer.xml", true).
这是我的临时 table 声明
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。
谢谢
从关于这个主题的快速 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
您始终可以使用 XML-NODE-TYPE
和 SERIALIZE-NAME
手动设置属性和标签名称。
但是:我已经与 Progress OpenEdge 一起使用了很多 xml:s 和 API:s,并且还没有因为命名空间问题而失败,但我想这可能取决于你想要什么处理数据。
由于您没有包含整个数据集,因此这只是一种猜测。对于这种特定情况,它或多或少会产生您想要的东西。我不知道应该如何呈现多个 "receipts",所以你可能需要更改它。
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).
您好,OpenEdge 开发人员,
我正在使用以下语法从临时 table 生成一个 XML 文件。除了一个项目,一切都很好。
dataset dsCust:write-xml("FILE", "c:/Test/Customer.xml", true).
这是我的临时 table 声明
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。
谢谢
从关于这个主题的快速 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
您始终可以使用 XML-NODE-TYPE
和 SERIALIZE-NAME
手动设置属性和标签名称。
但是:我已经与 Progress OpenEdge 一起使用了很多 xml:s 和 API:s,并且还没有因为命名空间问题而失败,但我想这可能取决于你想要什么处理数据。
由于您没有包含整个数据集,因此这只是一种猜测。对于这种特定情况,它或多或少会产生您想要的东西。我不知道应该如何呈现多个 "receipts",所以你可能需要更改它。
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).