UTL_FILE.GET_LINE修剪我的XML标记

时间:2018-02-12 18:59:48

标签: xml oracle plsql plsqldeveloper

我一直在努力解决这个问题已经有一段时间了。这是我使用

的功能
SparkConf conf = new SparkConf().setAppName(appName);
JavaStreamingContext ssc = new JavaStreamingContext(conf, Durations.minutes(1));

Map<String, Object> params = new HashMap<String, Object>() {{
    put("bootstrap.servers", kafkaServers);
    put("key.deserializer", kafkaKeyDeserializer);
    put("value.deserializer", kafkaValueDeserializer);
}};

List<String> topics = new ArrayList<String>() {{
    // Add Topics
}};

JavaInputDStream<ConsumerRecord<String, String>> stream =
    KafkaUtils.createDirectStream(ssc,
        LocationStrategies.PreferConsistent(),
        ConsumerStrategies.<String, String>Subscribe(topics, params)
    );

stream.foreachRDD(rdd -> rdd.groupBy(record -> record.value().getMessageId()));

ssc.start();
ssc.awaitTermination(); 

此代码的目的是将编码类型从UTF8更改为ISO-8859-1从XML文件。为此,我下载文件,将它们保存到我的服务器中,然后,使用上面粘贴的代码,打开所述文件,从XML中读取一行,然后将其再次粘贴到同一文件中。当我读取第一行(l_encabezado var为TRUE,然后为false)时,我将其更改为我选择的编码类型。第一个之后的每一行都按原样读取和粘贴。

我想,问题来自以下几行:

FUNCTION change_header_XML2 (l_nom_archivo IN VARCHAR2 DEFAULT NULL) RETURN number IS


  F UTL_FILE.FILE_TYPE;
  V_LINE VARCHAR2 (32767);

  --File read variables
  fileHandler UTL_FILE.FILE_TYPE;

  -- Variables control
  l_encabezado boolean := TRUE;
  l_var1 varchar2(32767)  := '';
  l_tag_fin number := 0;
  l_temp_var1 varchar2(32767) := 0;

  BEGIN

--Open file from directory
    F := UTL_FILE.FOPEN ('/home/dir1/dir2/', l_nom_archivo, 'R', 32767); --path for reading file

    fileHandler:=utl_file.fopen('/dir3/',l_nom_archivo,'W'); --Creates a new file

    IF UTL_FILE.IS_OPEN(F) THEN
      LOOP
        BEGIN --Reads XML line by line until EOF
          UTL_FILE.GET_LINE(F, V_LINE, 1000);
          IF V_LINE IS NULL THEN
            EXIT;
          END IF;

          IF (l_encabezado) THEN --changes the encoding of XML from UTF8 to ISO-8859-1
            l_encabezado := FALSE;
            l_var1 := '<?xml version="1.0" encoding="ISO-8859-1"?>';
          ELSE
            l_var1 := V_LINE; -- reads everything else
          END IF;                

      UTL_FILE.put_line(fileHandler, CONVERT(l_var1, 'WE8ISO8859P1', 'UTF8'));   --Inputs the readed line into the file. *Here is where the length trims the xml tag*

          utl_file.fflush(fileHandler);  --Save file in dir

        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            EXIT;
          WHEN OTHERS THEN
            HTP.P('<br><BR>An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
        END;
      END LOOP;
    ELSE
      HTP.P('The File dosent exists');
      dbms_output.put_line('The File dosent exists');
    END IF;

    UTL_FILE.FCLOSE(F);

    --Closes file
    utl_file.fflush(fileHandler);  
    UTL_FILE.FCLOSE(fileHandler);  

    return 1;

  EXCEPTION
     WHEN OTHERS THEN
        HTP.P('<br>An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
        dbms_output.put_line(SUBSTR( SQLERRM|| ', ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),0,999));

END change_header_XML2;

当文件中的一行太长时,UTL_FILE会剪切该行并将其粘贴到文件中,然后继续读取它,然后将其余部分粘贴到之前发布的下一行的下一行。这对普通文本很好,但有时我的XML结束标记会被修剪,如下图所示:

Kafka Connector

job_Major_List结束标记在2个单独的行中被切断,这完全打破了XML文件。我尝试为函数UTL_FILE.GET_LINE更改1000 PLS_INTEGER的值但是无法使其工作,我似乎无法理解PLS_INTEGER的工作原理。

1 个答案:

答案 0 :(得分:0)

您正在使用UTL_FILE.PUT_LINE引入不需要的行终结符字符,而是使用UTL_FILE.PUT