2008-10-31 2 views
2

스트림을 입력으로 사용하면 XML 데이터 소스에 대해 XPathNavigator를 안전하게 만들 수 있습니까?C#의 스트림에 대해 XPathNavigator를 안전하게 만들려면 어떻게해야합니까?

XML 데이터 소스 :

  • 가능성이 제거 될 필요가 잘못된 16 진수 문자를 포함 할 수 있습니다.
  • 문서의 선언 된 인코딩과 일치하지 않는 문자가 포함될 수 있습니다. 예를 들어

는 클라우드에서 일부 XML 데이터 소스 UTF-8의 선언 인코딩을해야하지만 실제 인코딩은 창-1252 또는 의 원인이 ISO 8859-1입니다 스트림에 대해 XmlReader를 만들 때 잘못된 문자 예외가 throw됩니다. "자동 검색을 코딩하는 것은 상기 제까지 수행되지 않기 때문에 현재의 리더에 의해 사용되는 현재의 문자 인코딩 값이 StreamReader와 임의의 읽기 방법의 첫 번째 호출 후에 다를 수있다. StreamReader.CurrentEncoding 등록 문서에서

Read 메서드를 호출하십시오. " 이것은 CurrentEncoding이 첫 번째 읽기 후에 검사 될 수 있지만 XML 데이터를 Stream에 쓸 필요가있을 때이 인코딩을 저장하는 것으로 나타났습니다.

유효하지 않은 문자 문제 (예 : C#)의 인코딩을 정상적으로 처리 할 XML 데이터 소스에 대해 XPathNavigator/IXPathNavigable 인스턴스를 안전하게 만드는 것이 가장 좋습니다.

답변

2

일부 XML 조각을 잘못된 인코딩 (XML 조각과 함께 저장된 인코딩 없음)을 사용하여 CRM 시스템으로 가져온 경우 비슷한 문제가있었습니다.

루프에서 나는 목록의 현재 인코딩을 사용하여 래퍼 스트림을 만들었습니다. 인코딩은 DecoderExceptionFallback 및 EncoderExceptionFallback 옵션 (@Doug에서 언급 한대로)을 사용하여 구성되었습니다. 처리 중에 DecoderFallbackException가 슬로우되면 (자), 원의 스트림이 리셋되어 다음에 가장 가능성이있는 인코딩이 사용됩니다.

인코딩 목록은 UTF-8, Windows-1252, GB-2312 및 US-ASCII와 비슷합니다. 목록의 끝에서 떨어지면 스트림이 정말 좋지 않아 거부되거나 무시되었습니다.

는 편집 :

나는 빠른 샘플 및 기본 테스트 파일 (소스 here)를 채찍질. 코드에는 동일한 바이트 세트와 일치하는 코드 페이지 중에서 선택할 수있는 경험적 방법이 없기 때문에 파일 내용 및 인코딩 기본 설정 순서에 따라 Windows-1252 파일이 GB2312로, 그 반대로도 검색 될 수 있습니다.

+0

문제의 좋은 해결책 인 것처럼 들리지만, 예제 코드를 제공해 줄 수 있습니까? – Oppositional

+0

샘플 링크 추가 – devstuff

+0

감사합니다! 현상금을 얻었 어. – Oppositional

0

XmlTextReader 또는 비슷한 것을 사용할 때 독자는 xml 파일에 선언 된 인코딩을 알아냅니다.

+0

StreamReader.CurrentEncoding : "현재 판독기에서 사용하는 현재 문자 인코딩으로, StreamReader의 Read 메서드를 처음 호출 한 후 값이 다를 수 있습니다. 인코딩 메서드는 읽기 메서드를 처음 호출 할 때까지 자동 검색이 수행되지 않습니다." 읽기 후에 CurrentEncoding하는 것이 좋습니다? – Oppositional

1

잘못된 문자를 다루는 데는 DecoderFallback 클래스 (및 몇 개의 관련 클래스)를 사용하거나 건너 뛰거나 다른 작업 (새 인코딩으로 다시 시작 하시겠습니까?)을 수행 할 수 있습니다.

+0

이것이 작동하는지 잘 모르겠지만 좋은 방법 인 것 같습니다. 내가 할 수있는 유일한 방법은 사용자 지정 XML 파서를 굴리는 것입니다. 좋은 대답. –