2011-12-14 4 views
2

Я пытаюсь разобрать XML-файл из URI с помощью STAX!stax получение значения атрибута из элементов

XML ищет что-то вроде этого:

<Type type_id="4218"> 
     <Title>English Premier League</Title> 

     <Event start_time="2011-12-18 16:10:00" ev_id="2893772"> 
       <Description>Manchester City v Arsenal</Description> 

        <Market mkt_typ="Win/Draw/Win"> 
         <Occurrence bet_id="42455761" decimal="1.6666666666667"> 
           <Description>Manchester City</Description> 
         </Occurrence> 
         <Occurrence bet_id="42455762" decimal="3.6"> 
           <Description>Draw</Description> 
         </Occurrence> 
         <Occurrence bet_id="42455764" decimal="5"> 
          <Description>Arsenal</Description> 
          </Occurrence> 
        </Market> 

      </Event> 
    </Type> 

вывод должен быть:

id:4218 
title:English Premier League 
ev_id:2893772 
date of match:Sun Dec 18 16:10:00 CET 2011 
description:Manchester City v Arsenal 
one:1.6666666666667 
draw:3.6 
two:5 

Мой код выглядит примерно так:

XMLInputFactory factory = XMLInputFactory.newInstance(); 

     try { 
      XMLStreamReader streamReader = factory.createXMLStreamReader(new URL("http://cubs.bluesq.com/cubs/cubs.php?action=getpage&thepage=385.xml").openStream()); 


      while (streamReader.hasNext()) { 
       int event = streamReader.next(); 

       if(event == XMLStreamConstants.START_ELEMENT){ 
        if(streamReader.getLocalName().equals("Type")){ 
         long id = Integer.parseInt(streamReader.getAttributeValue(null, "type_id")); 
         if(id == 4218){ 
          System.out.println("id:"+id); 
          streamReader.nextTag(); 
          System.out.println("title:"+streamReader.getElementText()); 
          streamReader.nextTag(); 
          int ev_id = Integer.parseInt(streamReader.getAttributeValue(null, "ev_id")); 
          System.out.println("ev_id:"+ev_id); 
          DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
          formater.setTimeZone(TimeZone.getTimeZone("CET")); 
          String tempDatum = streamReader.getAttributeValue(null,"start_time"); 
          Date dateOfMatch = formater.parse(tempDatum); 

          System.out.println("date of match:"+dateOfMatch); 
          streamReader.nextTag(); 
          String description = streamReader.getElementText(); 

          System.out.println("description:"+ description); 
          streamReader.nextTag(); 
          String market = streamReader.getAttributeValue(null, "mkt_typ"); 
          if(market.equals("Win/Draw/Win")){ 
           streamReader.nextTag(); 
            double one = Double.parseDouble(streamReader.getAttributeValue(null, "decimal")); 
            System.out.println("one:"+ one); 

            double draw = Double.parseDouble(streamReader.getAttributeValue(null, "decimal")); 
            System.out.println("draw:"+draw); 
            double two = Double.parseDouble(streamReader.getAttributeValue(null, "decimal")); 
            System.out.println("two:"+two); 

          } 


         } 
        } 
       } 

      } 

Этот код производит выход:

id:4218 
title:English Premier League 
ev_id:2893772 
date of match:Sun Dec 18 16:10:00 CET 2011 
description:Manchester City v Arsenal 
one:1.6666666666667 
draw:1.6666666666667 
two:1.6666666666667 

как мне получить другие значения из атрибута «десятичный» в элементах «Возникновение» ???

+0

Это выглядит как работа для XSLT и/или XPath ... Я Я уверен, что у вас есть причины использовать эту библиотеку, и я понятия не имею, хорошо это или нет, но я знаю, что XPath и XSLT являются удивительными, и они (в частности, XPath) могут легко выводить ваши результаты (IMHO) –

+0

I thi nk это точно задание для SAX или StAX, потому что он выполняет итерацию через все элементы и все данные в этом XML. – viktor

+0

@Cody S Xpath не может использовать на Stax http://stackoverflow.com/questions/1863250/is-it-there-any-xpath-processor-for-sax-model – dusmanka

ответ

2

if(market.equals("Win/Draw/Win")){ streamReader.nextTag();

Я был только быстрый взгляд, но я бы сказал, вы, вероятно, остановились на первом элементе, так как вхождение вы звоните streamReader.nextTag() только один раз, но streamReader.getAttributeValue три раза.

0

private String xmlFile = "расположение файла"; private String wishAttribute; .

...

ClassLoader ClassLoader = this.getClass() getClassLoader();

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
    InputStream inputStream = classLoader.getResourceAsStream(xmlFile); 
    XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(inputStream); 

попробовать {

 while (xmlEventReader.hasNext()) { 
      XMLEvent event = xmlEventReader.nextEvent(); 

      if (event.isStartElement()) { 
       StartElement startElement = event.asStartElement(); 

       QName qname = startElement.getName(); 
       String elementName = qname.toString(); 
       if (elementName.equals("My Element")) { 
        Iterator attributes = startElement.getAttributes(); 
        while (attributes.hasNext()) { 
         Attribute attribute = (javax.xml.stream.events.Attribute) (attributes.next()); 
         String attribute= attribute.getValue(); 

         desiredAttribute = attribute; 
        } 

...

Вы также можете проверить имя атрибута в то время как итерация

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