2014-01-31 2 views
0

OGC 불만 웹 기능 서비스에서 다운로드 한 메모리에 매우 유효한 XM1 문자열이 있습니다.
내 파서 구문 분석 오전하여 XmlTextReader를 만들려면 다음 코드를 사용루트 수준의 데이터가 잘못되었습니다. 줄 1, 위치 1에서 유효한 메모리 xml

 using (var sr = new StringReader(schemaString)) 
     { 
      using (var reader = new XmlTextReader(sr)) 
      { 
       try 
       { 
        schema = new GML2Parser().GetClassDefinition(reader, schema); 
       } 
       catch (Exception ex) 
       { 
        error = ex.Message; 
       } 
      } 
     } 

나는 rool 수준에서 데이터를 나타내는 예외가 잘못 얻을. 이 문자열을 feature_desc.xsd라는 로컬 파일에 저장하면 File.ReadAllText를 사용하고 앞서 언급 한 루틴을 호출하면 비슷한 문제가 발생합니다.

그러나 XmlReader.Create (feature_desc.xsd)를 사용하면 내 파서는 XML 노드를 통과하기 시작할 때 예외를 throw하지 않습니다. 이 작업을 요약하는 방법입니다. 문자열의 메모리 표현에서

private void ParseFeatureDescription(DataTableInfo schema, string featureDescription, string featureFileName, string featureName) 
     { 
      var schemaLocation = string.Empty; 
      if (featureFileName != null) 
      { 
       XmlDocument doc = new XmlDocument(); 
       doc.LoadXml(featureDescription); 
       schemaLocation = infrut.Utilities.CreateTempFilePath(featureFileName, FileExtension.xsd, false); 
       doc.Save(schemaLocation); 
      } 

      var error = DeserializeTableSchema(schema, featureDescription, featureName); 
      if (!string.IsNullOrEmpty(error)) 
      { 
       var fromFileFeatureDesc = File.ReadAllText(schemaLocation); 
       if (featureDescription == fromFileFeatureDesc){} 
       error = DeserializeTableSchema(schema, fromFileFeatureDesc, featureName); 

       if (!string.IsNullOrEmpty(error)) 
       { 
        // last resort 
        var reader = XmlReader.Create(schemaLocation); 
        schema = new GML2Parser().GetClassDefinition(reader, schema); 
        if (schema.Columns.Count == 0) 
        { 
         // trouble 
         ActionResponse.LogError("Error parsing description of " + featureName + ". Inner exception is \r\n" + error 
          + " " + " for content \r\n" + fromFileFeatureDesc, "WFS Worker"); 
        } 
       } 
      } 
     } 

은 다음과 같습니다

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:ems=\"http://www.emssatcom.com\" xmlns:gml=\"http://www.opengis.net/gml\" elementFormDefault=\"qualified\" targetNamespace=\"http://www.emssatcom.com\">\r\n <xsd:import namespace=\"http://www.opengis.net/gml\" schemaLocation=\"http://10.25.131.62:8091/geoserver/schemas/gml/2.1.2/feature.xsd\" />\r\n <xsd:complexType name=\"asmcc_srr_viewType\">\r\n <xsd:complexContent>\r\n  <xsd:extension base=\"gml:AbstractFeatureType\">\r\n  <xsd:sequence>\r\n   <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"gid\" nillable=\"true\" type=\"xsd:int\" />\r\n   <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"srr_name\" nillable=\"true\" type=\"xsd:string\" />\r\n   <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"the_geom\" nillable=\"true\" type=\"gml:PolygonPropertyType\" />\r\n  </xsd:sequence>\r\n  </xsd:extension>\r\n </xsd:complexContent>\r\n </xsd:complexType>\r\n <xsd:element name=\"asmcc_srr_view\" substitutionGroup=\"gml:_Feature\" type=\"ems:asmcc_srr_viewType\" />\r\n</xsd:schema>" 

및 지속 파일은 다음과 같습니다이에

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ems="http://www.emssatcom.com" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" targetNamespace="http://www.emssatcom.com"> 
    <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://10.25.131.62:8091/geoserver/schemas/gml/2.1.2/feature.xsd" /> 
    <xsd:complexType name="asmcc_srr_viewType"> 
    <xsd:complexContent> 
     <xsd:extension base="gml:AbstractFeatureType"> 
     <xsd:sequence> 
      <xsd:element maxOccurs="1" minOccurs="0" name="gid" nillable="true" type="xsd:int" /> 
      <xsd:element maxOccurs="1" minOccurs="0" name="srr_name" nillable="true" type="xsd:string" /> 
      <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:PolygonPropertyType" /> 
     </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 
    <xsd:element name="asmcc_srr_view" substitutionGroup="gml:_Feature" type="ems:asmcc_srr_viewType" /> 
</xsd:schema> 

어느 하나 개 실행?

+0

을 유니 코드, ANSI 문자열로 파일을 읽을 수 있습니다. NET 2.0부터는 사용되지 않습니다. 대신'XmlReader.Create()'또는'XmlWriter.Create()'를 사용하십시오. –

+0

또한 무슨 일이 일어나고 있는지 알고 싶다면'ex.Message' 만 표시하면 안됩니다. 항상'ex.ToString()'을 사용하면 모든 것을 보여줍니다. –

+0

@ JohnSaunders, 팁 주셔서 감사합니다. –

답변

1

여기서 추측하기 : 때때로 UTF-8 인코딩으로 저장되고 텍스트/파일의 맨 처음에 바이트 순서 표시가 있으므로 다른 응용 프로그램에서이 오류 (1 행 1 열)가 표시됩니다. http://en.wikipedia.org/wiki/Byte_order_mark

시도하지 참고로, 당신은`새로운 XmlTextReader는()`또는`새로운 XmlTextWriter의을()`사용해서는 안

관련 문제