2016-11-23 36 views
0

我正在使用StAX Iterator API讀取xml。如何獲取StAX XMLEvent對象的整個文本?

XML:

<FormData OID="QUAL"> 
    <IGData IGRepeatKey="1" IGOID="SQUAL" TType="Insert"> 
     <IData Value="0859" IOID="SID"></IData> 
     <IData Value="DM" IOID="RDOMAIN"></IData> 
    </IGData> 
    <IGData IGRepeatKey="1" IGOID="SQUAL" TType="Insert"> 
     <IData Value="0860" IOID="SID"></IData> 
     <IData Value="2013-01-03T02:00" IOID="QVAL"></IData> 
    </IGData> 
</FormData> 

而斯塔克斯代碼:

while(xmlEventReader.hasNext()){ 
    xmlEvent = xmlEventReader.nextEvent(); 
    eventString = xmlEvent.toString(); 
    if(xmlEvent.isStartElement() && eventString.contains("FormData") && eventString.contains("QUAL")){ 
     //do something 
    } 

}

這是工作(eventString有一個XMLEvent的全部文本)在我的本地環境。

但是,當我部署到服務器,eventString包含像「Stax事件#1」。所以如果條件返回false。

我以爲兩者都使用不同的XMLEvent實現。所以我通過代碼檢查它,jar在兩種環境中都是相同的:jre1.8.0_73/lib/rt.jar!/javax/xml/stream/events/XMLEvent.class

如何獲取XMLEvent的整個文本目的?我在這裏做錯了什麼?請建議任何其他選擇。

+0

Stax API中沒有指定toString應返回的內容。所以你不應該編碼。 Stax的實際實現取決於許多因素(系統環境,JSE和JEE中不同的JAR的類加載器排序,META-INF文件的存在...)。你可以閱讀它,但不要僅僅依靠同樣的罐子。您應該閱讀關於XMLEvent API的更多信息,按照教程進行操作,並不是針對您在此處做的事情做出的,例如從給定節點開始,並打印該節點的內容。這是可行的,但很複雜。 – GPI

+0

@GPI如何讀取節點的內容? – Hello

+0

@GPI爲什麼它在當地環境中工作?任何想法 – Hello

回答

1

每個XML事件有3個狀態

  1. 開始元素
  2. 是人物
  3. 結束元素

對於例如,如果您需要訪問數據 「IGRepeatKey」從你的xml文件,然後在狀態(開始元素),你需要檢查IGData標籤是否已經開始,如果它是真的。開始一個新的迭代器,它將遍歷所有的標籤,例如IGRepeatKey,IGOID,TType。這樣

Iterator<Attribute> iterator = element.getAttributes(); 
while (iterator.hasNext()) 
{ 
    Attribute attribute = (Attribute)iterator.next(); 
    QName name = attribute.getName(); 
    String value = attribute.getValue(); 
    System.out.println(name+" + "+value); 
} 

嘗試一些在xml.isStartElement()塊添加此迭代器。