2016-03-15 76 views
0

我有两个单独的表,其中一个XML类型字段包含需要组合并创建为文件的数据。将2个单独的XMLType记录合并到一个xml文件中

表1包含SOAP包裹消息数据,表2包含SOAP附件正文 - 在本例中为XML格式的发票数据。

表使用batch_id,data_id和run_id相互关联,以便表1是批次发票的主数据,run_id和data_id充当标识符。在表1中的每个记录具有在细节表中的一个相关的记录(表2)

  • 表1:BATCH_ID(INT),Data_ID(INT),Run_ID(INT),SOAP_XML(XmlType将场)
  • 表2:BATCH_ID(INT),Data_ID(INT),Run_ID(INT),INVOICE_XML(XmlType将场)

我只是想提出一个函数或过程到这些XMLType数据合并到一个XML文件 - 一个文件包含一个批处理ID的所有记录,所以我需要循环两个表中的每个data_id。

我试图使用XMLConcat,XMLRoot,XMLElement函数,但没有设法避免最终XML文件中的额外元素 - 最终结果必须与XMLType字段中的数据完全相同 - 只将这两个单独记录到一个XML文件(SOAP信封+ SOAP附件)

我想有一个简单的解决方案,但在尝试了不同的解决方案后,还没有发现任何直接做这个,有什么建议吗?

表1:XMLType数据例如

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"> 
    <SOAP-ENV:Header> 
    <eb:MessageHeader xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd" SOAP-ENV:mustUnderstand="1" eb:id="xxxxxxxxxxxxxxxxxxxxxxxx"> 
    <eb:From> 
    <eb:PartyId>xxxxxxxxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Sender</eb:Role> 
    </eb:From> 
    <eb:From> 
    <eb:PartyId>xxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Intermediator</eb:Role> 
    </eb:From> 
    <eb:To> 
    <eb:PartyId>xxxxxxxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Receiver</eb:Role> 
    </eb:To> 
    <eb:To> 
    <eb:PartyId>xxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Intermediator</eb:Role> 
    </eb:To> 
    <eb:CPAId>yoursandmycpa</eb:CPAId> 
    <eb:ConversationId>xxxxxxxxxx</eb:ConversationId> 
    <eb:Service/> 
    <eb:Action/> 
    <eb:MessageData> 
    <eb:MessageId>xxxxxxx</eb:MessageId> 
    <eb:Timestamp>2016-03-01T10:26:04</eb:Timestamp> 
    <eb:RefToMessageId/> 
    </eb:MessageData> 
    </eb:MessageHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
    <eb:Manifest eb:id="Manifest" eb:version="2.0"> 
    <eb:Reference eb:id="Invoice" xlink:href="xxxxxx"> 
    <eb:Schema eb:location="Invoice.xsd" eb:version="1.0"/> 
    </eb:Reference> 
    </eb:Manifest> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

表2:XMLType的示例

<?xml version="1.0" encoding="ISO-8859-15"?> 
<?xml-stylesheet type="text/xsl" href="Invoice.xsl"?> 
<Invoice Version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Invoice.xsd"> 
<SellerPartyDetails> 
<SellerPartyIdentifier>xxxxxxxxxxxxxxx</SellerPartyIdentifier> 
<SellerOrganisationName>xxxxxxxxxxxxxxxxxxxxxxxx</SellerOrganisationName> 
<SellerOrganisationTaxCode>xxxxxxxxxxxxx</SellerOrganisationTaxCode> 
<SellerPostalAddressDetails> 
<SellerStreetName>xxxxxxxxxxxxxxxxxx</SellerStreetName> 
<SellerTownName>xxxxxxxxxxxxxxxxxxxxxx</SellerTownName> 
<SellerPostCodeIdentifier>xxxxxxxxxxxxxxxxx</SellerPostCodeIdentifier> 
</SellerPostalAddressDetails> 
</SellerPartyDetails> 
</Invoice> 

期望得到的数据文件仅仅是一个从表组合1 & 2的记录 - 象下面这样:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"> 
    <SOAP-ENV:Header> 
    <eb:MessageHeader xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd" SOAP-ENV:mustUnderstand="1" eb:id="xxxxxxxxxxxxxxxxxxxxxxxx"> 
    <eb:From> 
    <eb:PartyId>xxxxxxxxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Sender</eb:Role> 
    </eb:From> 
    <eb:From> 
    <eb:PartyId>xxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Intermediator</eb:Role> 
    </eb:From> 
    <eb:To> 
    <eb:PartyId>xxxxxxxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Receiver</eb:Role> 
    </eb:To> 
    <eb:To> 
    <eb:PartyId>xxxxxxxxxxxxx</eb:PartyId> 
    <eb:Role>Intermediator</eb:Role> 
    </eb:To> 
    <eb:CPAId>yoursandmycpa</eb:CPAId> 
    <eb:ConversationId>xxxxxxxxxx</eb:ConversationId> 
    <eb:Service/> 
    <eb:Action/> 
    <eb:MessageData> 
    <eb:MessageId>xxxxxxx</eb:MessageId> 
    <eb:Timestamp>2016-03-01T10:26:04</eb:Timestamp> 
    <eb:RefToMessageId/> 
    </eb:MessageData> 
    </eb:MessageHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
    <eb:Manifest eb:id="Manifest" eb:version="2.0"> 
    <eb:Reference eb:id="Invoice" xlink:href="xxxxxx"> 
    <eb:Schema eb:location="Invoice.xsd" eb:version="1.0"/> 
    </eb:Reference> 
    </eb:Manifest> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
<?xml version="1.0" encoding="ISO-8859-15"?> 
    <?xml-stylesheet type="text/xsl" href="Invoice.xsl"?> 
    <Invoice Version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Invoice.xsd"> 
    <SellerPartyDetails> 
    <SellerPartyIdentifier>xxxxxxxxxxxxxxx</SellerPartyIdentifier> 
    <SellerOrganisationName>xxxxxxxxxxxxxxxxxxxxxxxx</SellerOrganisationName> 
    <SellerOrganisationTaxCode>xxxxxxxxxxxxx</SellerOrganisationTaxCode> 
    <SellerPostalAddressDetails> 
    <SellerStreetName>xxxxxxxxxxxxxxxxxx</SellerStreetName> 
    <SellerTownName>xxxxxxxxxxxxxxxxxxxxxx</SellerTownName> 
    <SellerPostCodeIdentifier>xxxxxxxxxxxxxxxxx</SellerPostCodeIdentifier> 
    </SellerPostalAddressDetails> 
    </SellerPartyDetails> 
    </Invoice> 
+1

XML文件**必须包含**一个单独的根**元素。因此,一个简单的连接不会产生格式良好的XML文件。任何XML解析器(根据W3标准)必须在接收到此类文件时收到错误消息。 –

+0

是的,这正是我在这里之后 - 格式良好的XML文件 - 目标XML格式良好,因为2个独立的xmltype数据字段包含正确和合理的数据(单独),一旦我弄清楚如何将这两个组合成一个元素,它将包含正确的根元素+正确的附件作为单个XML文件。 我其实已经接近使用XMLELEMENT落脚点但增加了额外的元素到根,我不能使用,因为Table 1和Table XMLType的记录已经包含正确的根元素。 –

+0

你是说这两个XMLTypes含有相同的根元素,并希望自己的孩子节点的单个根元素下结合?如果您在问题中添加示例数据(尽可能减少而仍然相关)以及预期的组合结果,这将非常有帮助。 –

回答

0

你是否尝试过在PL/SQL中使用类似的东西:

declare 
    x varchar(1000); 
    begin 
    select column1||' '||column2 ... into x 
Where table.id = table2.id 

+0

我试图与产生的错误信息这样的 - 我的VARCHAR2(32767)是不够的数据.. 19011 00000 - “字符串缓冲区太小” *原因:要求的字符串结果是太大,返回回 *操作:获取结果作为一个吊射,而不是 –

+0

该死的,当然。你可以和你一起使用CLOB。 在pl/sql中有一个包dbms_lob。 有很多教程如何使用这个包,这些教程将比我更好地解释这个。我相信这会解决你的问题:) 而Alex Pool说 - 注意双根元素。 – q4zar

+0

也许这样的程序中的东西? SELECT x.OBJECT_VALUE.getCLOBVal()FROM xml_table X; 然后,我可以将两个部分都添加为变量,并将它们组合为CLOB并从中创建一个新的xml文件? –

0

我设法用一个简单的解决办法弄清楚这个问题:

PROCEDURE PR_COMPILE_DATA_INTO_FILE(
    P_TARGET_FOLDER IN VARCHAR2, 
    P_TARGET_FILENAME IN VARCHAR2, 
    P_SOAP_CLOB IN CLOB, 
    P_INVOICE_CLOB IN CLOB 
) 
AS 
    V_TEMP CLOB; 
BEGIN 
    dbms_lob.createtemporary(V_TEMP, true); 
    dbms_lob.append(V_TEMP, P_SOAP_CLOB); 
    dbms_lob.append(V_TEMP,P_INVOICE_CLOB); 
    dbms_xslprocessor.clob2file(V_TEMP,P_TARGET_FOLDER,P_TARGET_FILENAME,nls_charset_id('WE8ISO8859P1')); 
    dbms_lob.freetemporary(V_TEMP); 
END PR_COMPILE_DATA_INTO_FILE; 

的数据正确格式良好的XML结果文件,一切都过去了。

感谢您对此事的支持和帮助。

+0

好的,但这是一个包含两个XML片段的文本文件,而不是一个XML文档。它不是格式良好的XML。 –

相关问题