2010-01-02 11 views
0

웹에서 가져온 콘텐츠를 구문 분석해야하며 특수 문자가 포함될 수 있습니다. contet 위 org.xml.sax.helpers.DefaultHandler에서 확장 된 클래스, 메소드 문자()에 전달인코딩 문제

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <id>1</id> 
    <price>2.14</price> 
    <title>test &#382; test</title> 

:

이 경우 내용 문자열은 다음과 같이 나타납니다
public class ProductsXMLHandler extends DefaultHandler { 
... 

@Override  
public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     String elementValue = new String(ch, start, length); 
    ... 
} 

test &#382; test 세 개의 어레이로 분할되는 배열을 발견 '시험', '&#382;'및 '검사' 때문에 elementValue 결과가 있어야하는 test &#382; test 동일하지 않다. 누구든지 문제를 해결하는 방법을 알고 있습니까? 이 XML 핸들러 클래스에 전달되기 전에

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <id>1</id> 
    <price>2.14</price> 
    <title>test &#382; test</title> 

:

가 소스 문자열을 코딩 할 필요가 있습니까?

감사합니다.

답변

3

마찬가지로, on Skeet said in in answer으로, characters은 여러 번 호출됩니다. 당신은 당신이 찾고있는 바로 태그에있는 경우

  • startTag에서, (예를 들어, 부울 값) StringBuffer를하고, 메모를 생성 : 당신이해야 할 것은이 다음이다. 당신이 (부울 이전에 설정 한 경우 사실이다) 우측 태그에있는 경우 characters에서
  • endTag에, 당신이 바로 태그를 벗어나 려하는 경우 (부울, 같은 일을 볼
  • 의 StringBuffer의 문자를 넣어 이전처럼), StringBuffer와 voilà의 내용을 가져 가라. 완벽한 문자열입니다. 그 후에 StringBuffer를 비우는 것을 잊지 마십시오.
2

characters이 세 번 호출되는 것을 의미합니까? 그렇다면 코드를 처리하도록하면됩니다. 파서는 완벽하게 자유로 워야합니다. 한 번의 호출로 모든 문자 데이터를 가져올 것이라고 가정하면 안됩니다. DocumentHandler.characters()에 대한 문서에서

:

SAX 파서는 하나의 덩어리의 모든 연속 문자 데이터를 반환 할 수 있습니다, 또는 들이 복수의 체크에 분할; 그러나 단일 이벤트의 모든 문자는 동일한 외부 엔터티에서 가져와야하므로 로케이터 이 유용한 정보를 제공합니다.

2

SAX API에 대해 아무 것도 할 수 없다고 생각합니다. 구체적 http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

에서 파서 보고 문자 데이터 청크의 각각이 메소드를 호출한다. SAX 파서는 연속 된 문자 데이터를 단일 청크, 즉 또는 으로 반환 할 수 있습니다.이 문자는 여러 개의 청크로 분할 될 수 있습니다.; 그러나 단일 이벤트의 문자는 모두 이 동일한 외부 엔터티에서 가져와야하므로 로케이터가 유용한 정보를 제공해야합니다.

(내 강조)