Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 平面文件中出现NULL,无法使用XSD进行分析_Xml_Xsd_Flat File - Fatal编程技术网

Xml 平面文件中出现NULL,无法使用XSD进行分析

Xml 平面文件中出现NULL,无法使用XSD进行分析,xml,xsd,flat-file,Xml,Xsd,Flat File,我们正在尝试将基于位置的平面文件()转换为有效的XML。该文件包含标题、详细信息行和尾部 细节线有数据字符、空白字符和其他一些特殊字符,如NULL 填充一个位置长度的空字符。空间也填充一个位置长度 我们使用以下XSD来解析这个平面文件 <?xml version="1.0" encoding="UTF-8" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchem

我们正在尝试将基于位置的平面文件()转换为有效的XML。该文件包含标题、详细信息行和尾部

细节线有数据字符、空白字符和其他一些特殊字符,如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文档

但当我们用whi替换空值时,一切都很顺利

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

有没有其他方法来处理NULL


需要其他人的指导

如果NULL是指代码点为0的Unicode字符(通常写为NUL),那么XML中不允许使用此字符,您必须将其转换为其他字符。

好的,我们找到了解决方法

我们创建了自定义Java,用WhiteAPCE替换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", " "); 

将用witespace替换NUL字符

在将NUL字符转换为XML文件时,有没有办法转义NUL字符?或者给我一个提示,我们如何使用自定义Java程序替换NUL?您总是可以编写一个自定义InputStream实现来进行过滤。