2014-01-21 23 views
0

我们试图将基于位置的FLAT文件(http://i.stack.imgur.com/EryDU.jpg)转换为有效的XML。该文件包含标题,明细行,预告片。NULL出现在FLAT文件中,无法使用XSD解析

细节行有数据字符,whilespace字符和其他一些特殊字符,如NULL。

填充一个位置长度的NULL字符。空间也填充一个位置的长度。

我们使用以下XSD解析此平面文件

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

      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" 
         xmlns:tns="http://xmlns.oracle.com/pcbpel/nxsdABO" 
         targetNamespace="http://xmlns.oracle.com/pcbpel/nxsdABO" 
         elementFormDefault="qualified" 
         attributeFormDefault="unqualified" 

         nxsd:version="NXSD" 
         nxsd:stream="chars" 
         nxsd:encoding="ISO-8859-1" 
      > 


       <xsd:element name="ROOT"> 
       <xsd:complexType> 
       <xsd:sequence minOccurs="1"> 
        <xsd:element name="Header" nxsd:startsWith="H" minOccurs="1" maxOccurs="1"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="InterfaceID" type="xsd:string" nxsd:style="fixedLength" nxsd:length="3" /> 
          <xsd:element name="FileSeqNo" type="xsd:int" nxsd:style="fixedLength" nxsd:length="5" /> 
          <xsd:element name="TimeStamp" type="xsd:int" nxsd:style="fixedLength" nxsd:length="14" /> 
          <xsd:element name="FromSystem" type="xsd:string" nxsd:style="fixedLength" nxsd:length="10" /> 
          <xsd:element name="ToSystem" type="xsd:string" nxsd:style="fixedLength" nxsd:length="10" minOccurs="0"/> 
          <xsd:element name="FromSAPSys" type="xsd:string" nxsd:style="fixedLength" nxsd:length="8" minOccurs="0"/> 
          <xsd:element name="FromSAPclt" type="xsd:string" nxsd:style="fixedLength" nxsd:length="3" minOccurs="0"/> 
          <xsd:element name="ToSAPSys" type="xsd:string" nxsd:style="fixedLength" nxsd:length="8" minOccurs="0"/> 
          <xsd:element name="ToSAPclt" type="xsd:string" nxsd:style="fixedLength" nxsd:length="4" minOccurs="0"/> 
          <xsd:element name="UserID" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" minOccurs="0"/> 
         </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element>  

        <xsd:element name="DataLine2" nxsd:startsWith="D012" maxOccurs="unbounded" minOccurs="1"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="TransactionType" type="xsd:string" nxsd:style="fixedLength" nxsd:length="2" minOccurs="0"/> 
          <xsd:element name="Name" type="xsd:string" nxsd:style="fixedLength" nxsd:length="30" /> 
          <xsd:element name="PostingKey" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11" /> 
          <xsd:element name="AdderssKey" type="xsd:string" nxsd:style="fixedLength" nxsd:length="26" /> 
          <xsd:element name="TransactionKey" type="xsd:byte" nxsd:style="terminated" nxsd:terminatedBy="${eol}" minOccurs="0"/> 
         </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 


        <xsd:element name="Trailer" nxsd:startsWith="T" minOccurs="1" maxOccurs="1"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="FRecords" type="xsd:string" nxsd:style="fixedLength" nxsd:length="9" minOccurs="0"/> 
          <xsd:element name="DRecords" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" minOccurs="0"/> 
         </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
       </xsd:complexType> 
       </xsd:element> 

      </xsd:schema> 

SOA套件11g文件适配器无法解析平面文件,它返回空的XML文档时,文件中有NULL字符

但当我们用whi替换那些NULL时,事情工作正常。

我们在XSD中是否缺少解析NULL的内容?

是否有任何其他方法来处理NULL?从别人那里

回答

0

欧凯,我们得到了出路来对付它,

我们已经创建自定义Java与whitesapce更换NUL,

  String fileName =(String)getVariableData("FileName"); 
      String fileLocation =(String)getVariableData("FileLocation"); 

      String inputFile = fileLocation + "/" + fileName; 
      String outputFile = fileLocation + "/" + fileName + ".temp"; 

      FileInputStream fileInStream = new FileInputStream(inputFile); 
      DataInputStream inputStream = new DataInputStream(fileInStream); 
      BufferedReader bufferRead = new BufferedReader(new InputStreamReader(inputStream)); 

      String stringLine = ""; 

      FileWriter fileOutStream = new FileWriter(outputFile); 
      BufferedWriter bufferWrite = new BufferedWriter(fileOutStream); 

       while ((stringLine = bufferRead.readLine()) != null) { 
        stringLine = stringLine.replaceAll("\0", " "); 
        bufferWrite.write(stringLine); 
        bufferWrite.newLine(); 
       } 

      bufferWrite.close(); 

在上面的代码中

stringLine = stringLine.replaceAll("\0", " "); 

将取代NUL char with witespace

0

如果NULL你的意思码点0(通常写NUL)的Unicode字符

需要引导,那么这个角色并没有在XML允许的,你必须把它转换成别的东西。

+0

有什么办法逃避NUL字符在将它们转换为XML文件时?或给我提示我们如何使用定制Java程序取代NUL – user1589385

+0

您可以随时编写一个自定义的InputStream实现来执行过滤。 –