2016-09-19 3 views
0

Реальный пример XML-данных, которые я должен проанализировать и как настроен файл. это то, как файл представлен мне.Как получить одну конкретную часть данных из XML-файла с помощью XMLreader?

<?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() функция возвращает 'Sessions', то 'значение' тогда 'значения', но никогда не возвращает фактическое имя элемента , Мне нужно проверить, есть ли я на правильном элементе, а затем извлечь данные из этого элемента ...

ответ

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

Ваш идентификатор не является элементом - атрибутом элемента.

Вы должны прочитать атрибут вашего узла значения, см Javadoc для метода getAttributeValue:

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

Возвращает нормализованное значение атрибута атрибута с именами и LocalName Если NamespaceURI равен нулю пространство имен не проверяется на равенство

Так будет:

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-файл в объект Document, то просто вызовите

doc.getElementById("FILE_CREATE_DATE"); 

Это возвращает объект Element, который будет иметь метку времени, как ребенок. Вот ссылка на библиотеку: https://jsoup.org/

Это мой первый ответ StackOverflow, поэтому дайте мне знать, если это поможет!

+0

Я провел всю прошлую неделю, работая (или пытаюсь работать) с типом данных документа, но все, что мне когда-либо получал, было нулевым значением ... Я получил намного больше, используя XML-ридер. Я просто не мог заставить это возвращать ничего, кроме нулевого значения, когда я вызывал функцию getDocument. Спасибо за ваш ответ, хотя все ответы помогают мне думать ... –

0

попробовать что-то вроде

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

getAttributeValue: Возвращаемое значение данного индекса атрибута. для

<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(); 
} 

} 
Смежные вопросы