通过java服务将文档添加到另一个Document中

时间:2014-04-09 05:35:28

标签: java webmethods

我正在编写一个java服务,我正在构建输出文档。 但我的结构应该是:OutPut Doc是顶级文档。在里面,我想要另一个Doc说中级文档,在这个中间文档中我想要Key值。

但我的问题是如何将一个文档插入另一个文档。我看到IDataUtil有一个方法,它要求键作为字符串,值可以是对象。

我的代码是IDataUtil.put(idcvalueDoc, "Body", FullValue.toString());

但是这个Body不应该是字符串,它应该是文档。我想将一个Doc插入另一个。

请帮帮我

Image of output doc structure

4 个答案:

答案 0 :(得分:6)

要完成您的目标,您需要执行以下操作:

  1. 创建intermediateDoc IData对象
  2. 根据需要将键值元组添加到intermediateDoc
  3. 创建outputDoc IData对象
  4. 将intermediateDoc作为键值元组添加到outputDoc
  5. 将outputDoc添加到管道
  6. 以下是演示此内容的示例Java服务(请注意,为方便起见,在这里对添加到intermediateDoc的键值元组进行了硬编码):

    public static final void exampleService(IData pipeline) throws ServiceException {
      IDataCursor pipelineCursor = pipeline.getCursor();
    
      try {
        // create an intermediateDoc IData object
        IData intermediateDoc = IDataFactory.create();
        // create a cursor to use to add key value tuples to the intermediateDoc
        IDataCursor intermediateCursor = intermediateDoc.getCursor();
        // add key value tuples as required to the intermediateDoc
        IDataUtil.put(intermediateCursor, "key1", "value1");
        IDataUtil.put(intermediateCursor, "key2", "value2");
        // ...
        // destroy the intermediateCursor when done adding key value tuples
        intermediateCursor.destroy();
    
        // create an outputDoc IData object
        IData outputDoc = IDataFactory.create();
        // create a cursor to use to add key value tuples to the outputDoc
        IDataCursor outputCursor = outputDoc.getCursor();
        // add the intermediateDoc to the outputDoc
        IDataUtil.put(outputCursor, "intermediateDoc", intermediateDoc);
        // destroy the outputCursor when done adding key value tuples
        outputCursor.destroy();
    
        // add the outputDoc to the pipeline
        IDataUtil.put(pipelineCursor, "outputDoc", outputDoc);
      } finally {
        // destroy the pipelineCursor
        pipelineCursor.destroy();
      }
    }
    

答案 1 :(得分:0)

使用wmboost-data库,您可以写下:

public static final void exampleService(IData pipeline) throws ServiceException {

    Document outputDoc = Documents.create();

    Document intermediateDoc = outputDoc.docEntry("intermediateDoc").putNew();      
    intermediateDoc.entry("key1").put("value1");
    intermediateDoc.entry("key2").put("value2");

    Documents.wrap(pipeline).entry("outputDoc").put(outputDoc);
}

代码:

  1. 创建顶级文档 outputDoc
  2. intermediateDoc 创建为嵌套文档(另一种方法是独立创建它并稍后将其附加到其父级)
  3. 将条目值分配给 intermediateDoc
  4. outputDoc 添加到管道
  5. 免责声明:我是wmboost-data的作者。

答案 2 :(得分:0)

假设和设计输入/输出

假设

  1. ValuesInput[]的文档是输入,与输出的Values[]相同。
  2. columnValue 文档下的ValuesInput[] 文档包含名为additionalString的字符串变量(如果没有变量则没有意义在文件内/下
  3. 总的来说会是这样的:

    Input/Output Documents

    当然,您可以在设计输入/输出后通过右键单击鼠标并生成代码来生成代码 - >用于实现此服务。

    Code Generation

    但是,我试图用IDataMap给出一个例子,你可以在webMethods Javadoc com.softwareag.util.IDataMap中找到,而不是使用生成的代码。使用起来非常方便

      

    IDataMap

         

    IDataMap结合了IDataIDataCursorIDataUtil的功能,   和IDataFactoryIDataMap实现java.util.Map接口   Java Collections Framework,提供了一个熟悉而简单的方法   接口。 IDataMap扩展了地图界面,添加了getAs<Type>   方法,将返回值转换为特定类型。

    它是这样的:

    public static final void mapDocument(IData pipeline) throws ServiceException
    {
        // pipeline input by IDataMap
        IDataMap pipelineMap = new IDataMap(pipeline);
    
        // extracting Values input into IData[] variable array
        IData[] ValuesInput = pipelineMap.getAsIDataArray("ValuesInput");
    
        // Initiate OutDoc.Values length based on ValuesInput length
        IData[] Values = new IData[ValuesInput.length];
    
        // OutDoc.Values
        // Iterate and copying all ValuesInputDoc into OutDoc.Values
        for (int i = 0; i < ValuesInput.length; i++)
        {
            Values[i] = IDataUtil.clone(ValuesInput[i]);
        }
    
        // OutDoc
        IData OutDoc = IDataFactory.create();
        IDataMap outDocMap = new IDataMap(OutDoc);
    
        // OutDoc IDataMap
        String TableName = "TableName is Never assigned";
        outDocMap.put("TableName", TableName);
    
        // OutDoc.Values
        outDocMap.put("Values", Values);
    
        // Wrap the OutDoc into pipeline
        pipelineMap.put("OutDoc", OutDoc);
    
    }
    

    结果

    Result

答案 3 :(得分:-1)

只需检查WmPublic包中的以下任何内容是否有帮助:

pub.list:appendToDocumentList

pub.document:insertDocument