2014-04-01 3 views
3

StAX 및 XMLStreamReader를 사용하여 XML 파일을 읽는 동안 이상한 문제가 발생했습니다. 그것의 오류 또는 내가 뭔가 잘못하고 있는지 확실하지 않습니다. StAX 배우기. StAX에서 XML 노드 텍스트 가져 오기 XMLStreamConstants.CHARACTERS 이벤트

그래서 문제가

, XMLStreamConstants.CHARACTERS 이벤트에서

  1. , 나는 XMLStreamReader.getText() 방법으로 노드 텍스트를 수집 할 때.
  2. 노드 텍스트에 &, <, 또는 심지어 예를 들어 숨겨진 내용이있는 경우 텍스트 문자열의 첫 번째 부분 만 반환합니다. 예 : ABC & XYZ 만 반환 ABC

간체 자바 출처 :

// Start StaX reader 
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
    try { 
     XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inStream); 
     int event = xmlStreamReader.getEventType(); 
     while (true) { 
      switch (event) { 
       case XMLStreamConstants.START_ELEMENT: 
        switch (xmlStreamReader.getLocalName()) { 
         case "group": 
         // Do something 
          break; 
         case "source": 
          isSource = true; 
          break; 
         case "target": 
          isTarget = true; 
          break; 
         default: 
          isSource = false; 
          isTrans = false; 
          break; 
        } 
        break; 
       case XMLStreamConstants.CHARACTERS: 
        if (srcData != null) { 
         String srcTrns = xmlStreamReader.getText(); 
         if (srcTrns != null) { 
          if (isSource) { 
           // Set source text 
           isSource = false; 
          } else if (isTrans) { 
           // Set target text 
           isTrans = false; 
          } 
         } 
        } 
        break; 
       case XMLStreamConstants.END_ELEMENT: 
        if (xmlStreamReader.getLocalName().equals("group")) { 
         // Add to return list 
        } 
        break; 
      } 
      if (!xmlStreamReader.hasNext()) { 
       break; 
      } 
      event = xmlStreamReader.next(); 
     } 
    } catch (XMLStreamException ex) { 
     LOG.log(Level.WARNING, ex.getMessage(), MessageFormat.format("{0} {1}", ex.getCause(), ex.getLocation())); 
    } 

내가 정확히 내가 잘못하고 또는 어떻게 노드의 전체 텍스트를 수집하고 무엇을 아주 확실하지 않다.

StAX를 더 배우기위한 제안이나 요령이 있으면 도움이 될 것입니다. :-)

+0

코드와 스택 트레이스를 주시겠습니까? – Prabhaker

+0

@Prabhaker Yeap, 방금 내 코드의 단순화 된 버전을 추가 했으므로 완전한 코드를로드 할 수 없습니다. 감사. – Indigo

+1

죄송합니다 사과드립니다. 오류가 아니며 노드에서 전체 텍스트를 수집하는 데 문제가있었습니다. – Indigo

답변

7

나는 고생하고 조금 연구 한 후에 문제를 해결했다.

이스케이프 처리 된 엔터티 참조로 텍스트를 읽는 중 문제가 발생했습니다. 당신은

XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); 

true는 기본적으로이 (즉, 디코딩과 같은) 각각의 대체 텍스트와 내부 엔티티 참조를 대체 할 수있는 파서 지시에 XMLInputFactory IS_COALESCING을 설정하고 일반 문자로 읽을 필요가있다.

+0

이 한 줄로 내 문제를 해결했습니다. 고마워 – n0daft