如何将单个xml文件(包含两个单独的xml结构)拆分为多个xml文件

2020-08-16 21:08发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)您好, 我有以下要求将xml分...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,

我有以下要求将xml分成两个xml文件。 是否有任何xslt/java映射方法可将如下所示的xml从单个目标xml拆分为两个目标。

输入:单个文件中有两个xml结构。

<?xml version =" 1.0" encoding =" utf-8"?>

<永久雇员>

<员工>

工程师

........

<?xml version =" 1.0" encoding =" utf-8"?>

<合同工>

<员工>

Jane

工程师

.........

目标Xml:

-------------------

OutPut1:

<?xml version =" 1.0" encoding =" utf-8"?> Jane Engineer .......。

Output2:

<?xml版本=" 1.0"编码=" utf-8"?> <合同雇员> <雇员> <名字>简 <标题>工程师.......。

8条回答
半个程序猿
2020-08-16 22:01

Hello Bhupal,
当您拥有XML声明时-

<?xml version =" 1.0 在源文件中两次" encoding =" utf-8"?

,这将在解析XML时引起问题。 另一点是,您的源文件具有两个不带任何根节点的结构。

考虑到以上事实,您可以执行以下操作-我假设您正在尝试创建两个多带带的文件-一个用于 所有永久雇员记录,以及另一份关于合同雇员的记录。

步骤:

1。 您需要创建一个Java Mapping来删除XML声明,并将Root节点标签添加到源XML-

包com.sap.formatXML中;
 导入java.io.BufferedReader;
 导入java.io.InputStream;
 导入java.io.InputStreamReader;
 导入java.io.Reader;
 导入com.sap.aii.mapping.api.AbstractTransformation;
 导入com.sap.aii.mapping.api.StreamTransformationException;
 导入com.sap.aii.mapping.api.TransformationInput;
 导入com.sap.aii.mapping.api.TransformationOutput;

 公共类FormatXML扩展AbstractTransformation

 {
   公共无效transform(TransformationInput arg0,TransformationOutput arg1)引发StreamTransformationException
           {
         getTrace()。addInfo("已调用JAVA映射");
         字符串inData = convertStreamToString(arg0.getInputPayload()。getInputStream());
         字符串xUTF =" <?xml version = \" 1.0 \" encoding = \" utf-8 \"?>" ;;
         inData = inData.replace(xUTF,"");

         inData =" "。concat(inData).concat(" ");

    尝试
         {
         arg1.getOutputPayload()。getOutputStream()。write(outData.getBytes(" UTF-8"));
         }
         catch(异常e)
          {
             e.toString();
          }
          }
       公共字符串convertStreamToString(InputStream in)
       {
         StringBuffer sb = new StringBuffer();
         尝试
         {
         InputStreamReader isr =新的InputStreamReader(in);
         读者读者=
         新的BufferedReader(isr);
         诠释
         while(((ch = in.read())> -1){
             sb.append((char)ch);}
             reader.close();
         }
         catch(Exception异常)
         {
             exception.toString();
         }
         返回sb.toString();
         }
     } 

上面的代码将删除XML声明并添加一个Root节点标记,该标记将在修改源XML之后生成以下XML-

  
     <员工>
         
         工程师
     
     <员工>
         
          Engineer1 
     
 
 <合同工>
     <员工>
         
         工程师
     
     <员工>
          Jane2 
          Engineer2 
     
 
  

2。 从上述XML创建一个Source XSD并将其分配给发送方接口(接口应为无状态)-

3。 现在为Permanet员工和Contract员工分别创建2个独立的XSD。 然后创建具有两个操作的无状态入站服务接口,并在每个操作中分配XSD-

3。 使用多重映射为源和目标创建消息映射-

按如下所示更改映射中的签名-

4。 创建操作映射-在操作映射中,包括Java映射(第一步)和消息映射(第二步)。 添加入站服务和操作如下-

5, 创建目录对象和通道后,将对其进行测试-将创建两个PI消息,从而创建两个多带带的文件-一个用于Contract,另一个用于永久雇员。

请告诉我是否可行。

谢谢

Sugata

一周热门 更多>