2014-04-01 48 views
3

在閱讀使用StAX和XMLStreamReader的XML文件中,我遇到了一個奇怪的問題。不知道它是否有錯,或者我做錯了什麼。仍在學習StAX。問題越來越XML節點文本中的StAX XMLStreamConstants.CHARACTERS事件

所以問題是,

  1. XMLStreamConstants.CHARACTERS事件,當我收集節點文本XMLStreamReader.getText()方法。
  2. 如果有&,<,>甚至隱藏的東西,例如在節點文本,它只返回文本字符串的第一部分。 例如ABC & XYZ只返回ABC

簡化的Java來源:

// 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葉氏,只是增加了我的代碼的簡化版本,無法加載完整的代碼,它的太多了。謝謝。 – Indigo

+1

對不起,道歉,這不是一個錯誤,它是從節點收集完整文本的問題。 – Indigo

回答

7

我已經掙扎和研究了一下後,解決了這個問題。

正是有了逃脫的實體引用一個問題閱讀文本。您需要設置 XMLInputFactory IS_COALESCINGtrue

XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); 

基本上這告訴解析器各自的替換文本替換內部實體引用(換句話說,像解碼)和閱讀他們作爲普通字符。

+0

用這一行解決了我的問題。謝謝 – n0daft