2012-12-17 5 views
1

파일 내에 포함 된 UTF-16LE XML 문자열을 구문 분석하려고합니다. 실제 문자열을 String 객체로 읽어 들일 수 있으며 watch 윈도우에서 XML을 볼 수있어 잘 보입니다. 문제는 내가 그것을 분석하려고 할 때 예외가 던져지기 때문이다. getBytes 줄 및 InputStreamReader 생성자에서 UTF-16 및 UTF-16LE을 지정하려고했지만 여전히 예외가 throw됩니다.Java UTF-16LE 문자열에서 XML 구문 분석

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = null; 

builder = builderFactory.newDocumentBuilder();  
Document document = null; 
byte[] bytes = xmlString.getBytes(); 
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); 
InputSource is = new InputSource(new InputStreamReader(inputStream)); 
document = builder.parse(is); // throws SAXParseException 

편집 : 이것은 Android를 사용하고 있습니다. 또한 다음은 스택 추적의 맨 위에있는 예외입니다.

12-18 13 : 51 : 12.978 : W/System.err (5784) : org.xml.sax.SAXParseException : name expected (position : [email protected]의 START_TAG @ 1 : 2) 12-18 13 : 51 : 12.978 : W/System.err (5784) : org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse (DocumentBuilderImpl.parse) .java : 146) 12-18 13 : 51 : 12.978 : W/System.err (5784) : javax.xml.parsers.DocumentBuilder.parse (DocumentBuilder.java:107)

+0

wrmHeaderXml이란 무엇입니까? 문자열, 객체 또는 와트? 바이트에서 문자로, 그리고 문자에서 바이트로 다시 변환하는 것 같습니다. 왜? 이미 바이트가 있다면 그냥 InputSource (InputStream)에 입력하십시오. – leonbloy

+0

문자열 일 것입니다. Java String이기 때문에 내부 인코딩이 중요하지 않은 것보다 String 객체가 있고 콘솔에서 볼 수 있다고 말하면 – Raffaele

답변

2

다음은 내가 끝난 것입니다. 최대 수행 작업 :

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = null; 

builder = builderFactory.newDocumentBuilder();  
Document document = null; 
byte[] bytes = Charset.forName("UTF-16LE").encode(xmlString).array(); 
InputStream inputStream = new ByteArrayInputStream(bytes); 
document = builder.parse(inputStream); 

출처 : How does one create an InputStream from a String?

+0

String을 인코딩하는 목적은 무엇입니까? – Raffaele

+0

방금 ​​xmlString.getBytes를 호출하고이를 ByteArrayInputStream에 전달하면 SAXParseException이 발생합니다. – rplankenhorn

+0

하지만 문자열에서 바이트를 추출해야하는 이유는 무엇입니까? ['StringReader'] (http://docs.oracle.com/javase/6/docs/api/java/io/StringReader.html)를'InputSource' ctor로 전달하십시오. – Raffaele

1

같은 프로그램에서 문자열과 바이트를 앞뒤로 변환 할 필요가 없습니다. 다음과 같이 쉽게 설정할 수 있습니다.

String xml = "<root><tag>Hello World!</tag></root>"; 

Document dom = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 
+0

구문 분석 행에 SAXParseException을 발생시킵니다. – rplankenhorn

+0

무례 할 필요가 없습니다. 위의 구문 분석 행을 구문 분석 할 XML과 함께 사용하려고하면 SAXParseException이 발생합니다. 위의 STACK TRACE의 상단을 게시했습니다. 방금 xmlString.getBytes()를 호출하고 이진 데이터를 보면 UTF-16LE 인코딩입니다. 처음 두 바이트는 little endian UTF-16 인코딩이라고 알려주는 0xFF 0xFE입니다. – rplankenhorn

+0

@rplankenhorn'xmlString'처럼 실제로 BOM을 첫 문자로 포함하고있는 것처럼 들립니다. 이 첫 번째 문자를 문자열에서 제거한 다음 결과에서 StringReader를 만든 경우 바이트를 앞뒤로 구분하지 않고 파싱해야합니다. –