2016-09-19 83 views
0

我需要解析的XML數據以及如何配置文件的一個真實示例。這是文件如何呈現給我的。如何使用XMLreader從XML文件檢索一個特定的數據片段?

<?xml version="1.0"?> 
<session> 
    <values> 
    <value id="FILE_CREATE_DATE"> 
    <timestamp>2012-04-16T21:33:31Z</timestamp> 
    </value> 
    <value id="LAST_ACCESSED"> 
    <timestamp>2012-09-17T17:15:23Z</timestamp> 
    </value> 
    <value id="VERSION_TIMESTAMP"> 
    <timestamp>2012-04-16T21:33:31Z</timestamp> 
    </value> 
</values> 
</session> 

我需要進入此文件並檢索FILE_CREATE_DATE數據。

我迄今爲止代碼:

File xmlFile = new File(XMLFileData[i].getPath()); 
 
    FileInputStream myXMLStream = new FileInputStream(xmlFile); 
 

 
    XMLInputFactory XMLFactory = XMLInputFactory.newInstance(); 
 
    XMLStreamReader XMLReader = XMLFactory.createXMLStreamReader(myXMLStream); 
 
    while(XMLReader.hasNext()) 
 
    { 
 
     if (XMLReader.getEventType() == XMLStreamReader.START_ELEMENT) 
 
     {   
 
      String XMLTag = XMLReader.getLocalName(); 
 
      if(XMLReader.hasText()) 
 
      { 
 
      System.out.println(XMLReader.getText()); 
 
      break; 
 
      }        
 
     }  
 
     XMLReader.next(); 
 
    }

的「號·getLocalName()」函數返回「會話」,然後「值」,然後「價值」,但從未返回元素的實際名稱。我需要測試,看看我是否在正確的元素,然後檢索該元素的數據...

回答

0

XMLInputFactory XMLFactory = XMLInputFactory.newInstance(); 
 
      XMLStreamReader XMLReader = XMLFactory.createXMLStreamReader(myXMLStream); 
 
      while(XMLReader.hasNext()) 
 
      { 
 
       if (XMLReader.getEventType() == XMLStreamReader.START_ELEMENT) 
 
       {   
 
        String XMLTag = XMLReader.getLocalName(); 
 
        if(XMLTag.equals("value")) 
 
        { 
 
         String idValue = XMLReader.getAttributeValue(null, "id"); 
 
         if (idValue.equals("FILE_CREATE_DATE")) 
 
         { 
 
         System.out.println(idValue); 
 
         XMLReader.nextTag(); 
 
         System.out.println(XMLReader.getElementText()); 
 

 
         } 
 
        } 
 
       }  
 
       XMLReader.next(); 
 
      }

所以這段代碼是我從一個XML數據文件恢復的具體數據主題的所有痛苦的最終結果。我想感謝所有幫助我解決問題的人 - 無論我是否在尋找他們,他們讓我思考並導致解決方案...

0

你的id不是一個元素 - 它是元素屬性。

你應該閱讀你的價值節點的屬性,請參閱getAttributeValue方法的Javadoc:

http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getAttributeValue(java.lang.String,%20java.lang.String)

返回與 命名空間和localName的屬性的規範化屬性值。如果namespaceURI爲null命名空間爲 未檢查相等性

所以它會是:

String XMLTag = XMLReader.getLocalName(); 
if(XMLTag.equals("value")) { 
    String idValue = XMLReader.getAttributeValue(null, "id"); 
    //here idValue will be equal to FILE_CREATE_DATE, LAST_ACCESSED or VERSION_TIMESTAMP 
} 
+0

謝謝!這讓我走上了正確的軌道......我需要在XML文件中的這個位置恢復數據,並且在這之前我已經有了一段時間了。 –

0

我使用Jsoup這是一個解析HTML的庫。但它也可以用於xml。你必須先加載XML文件轉換成文檔對象,然後只需撥打

doc.getElementById("FILE_CREATE_DATE"); 

這將返回一個Element對象,將有時間戳作爲一個孩子。這裏是一個鏈接到圖書館:https://jsoup.org/

這是我的第一個StackOverflow答案,讓我知道它是否有幫助!

+0

上週我花了所有的工作(或試圖處理)文檔數據類型,但我回到它的所有內容都是空值...我使用XML閱讀器進一步得到了很多。我只是無法讓我在調用getDocument函數時返回空值以外的任何值。儘管感謝您的回覆,但所有回覆都有助於我思考...... –

0

嘗試像

if(XMLReader.getAttributeValue(0).equalIgnorecase("FILE_CREATE_DATE")) 

getAttributeValue:屬性的給定索引的返回值。 for

<value id="FILE_CREATE_DATE"> 

id是第一個屬性。所以XMLReader.getAttributeValue(0)

但在調用此之前,您必須驗證元素是否具有第一個屬性。因爲所有標籤都沒有至少1個屬性。

在jsoup可以查詢這樣

public static void main(String[] args) { 

Document doc; 
try { 
    doc = Jsoup.connect("http://www.dropbox.com/public/xml/yourfile.xml").userAgent("Mozilla").get(); 
    //<value id="FILE_CREATE_DATE"> 
    Elements links = doc.select("value[id=FILE_CREATE_DATE]"); 
    for (Element link : links) {    
     if(link.attr("id").contains("FILE_CREATE_DATE"))//find the link with some texts 
     { 
      System.out.println("here is the element you need"); 
     } 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

} 
相關問題