2016-06-14 5 views
0

У меня есть пример смешанного содержимого XML-документ (структура не может быть изменен):Синтаксический смешанного содержимого XML с помощью SAX

<items> 
    <item> ABC123 <status>UPDATE</status> 
    <units> 
     <unit Description="Each  ">EA  <saleprice>2.99</saleprice> 
      <saleprice2/> 
     </unit> 
    </units> 
    <warehouses> 
     <warehouse>100<availability>2987.000</availability> 
     </warehouse> 
    </warehouses> 
    </item> 
</items> 

Я пытаюсь использовать SAX анализатор на этом XML-документ, но и смешанного содержания элементы вызывают некоторые проблемы. А именно, я получаю пустую строку, возвращаемую при попытке обработать узел <item/>.

Мой обработчик:

@Override 
public void startElement(final String uri, 
     final String localName, final String qName, final Attributes attributes) throws SAXException { 

    final String fixedQName = qName.toLowerCase(); 
    switch (fixedQName) { 
     case "item": 
      prod = new Product(); 
      //prod.setItem(content); <-- doesn't work, content is empty since element just started 
      break; 
    } 

} 

@Override 
public void endElement(final String uri, final String localName, final String qName) throws SAXException { 
    final String fixedQName = qName.toLowerCase(); 
    switch (fixedQName) { 
     case "item": 
      prod.setItem(content); // <-- doesn't work either, only returns an empty string 
      // end element, set item 
      productList.add(prod); 
      break; 
     case "status": 
      prod.setStatus(content); 
      break; 
     // ... etc.... 
    } 

} 

@Override 
public void characters(final char[] ch, final int start, final int length) throws SAXException { 
    content = ""; 
    content = String.copyValueOf(ch, start, length).trim(); 
} 

Этот обработчик работает правильно для всего интереса, за исключением <item/> элемента. Он всегда возвращает пустую строку.

Если я добавить println() методы characters() распечатать content, я могу видеть, парсер в конечном счете, делает печать содержимого <item/>, однако это после того, как ожидается, (на следующем дополнительном characters() вызова метода анализатора)

Реферирование http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html, я знаю, что я должен попытаться объединить строки, возвращаемые из characters(), однако я не вижу, как это может быть, так как мне нужно, чтобы извлечь данные другого элемента, и жесткое кодирования исключения для первый элемент в методе characters() кажется неправильным.

Howe могу использовать SAX для извлечения данных смешанного содержания <item/> 'ABC123'?

+0

является SAX требования? Для содержимого смешивания обработка возвращаемых текстовых узлов может стать беспорядочной? Вы считали XPath, что упростит и упростит запись? –

ответ

1

Если элемент контент только из текста до открытия тега status элемента, то вы можете получить содержание элемента в startElement:

public void startElement(final String uri, 
    final String localName, final String qName, final Attributes attributes) throws SAXException { 

    final String fixedQName = qName.toLowerCase(); 
    switch (fixedQName) { 
     case "item": 
      prod = new Product(); 
      break; 
     case "status": 
      prod.setItem(content); 
      break; 
    } 
} 

Чтобы понять, рассмотрит поток событий:

  • StartElement item
  • символов "ABC123"
  • StartElement status
  • символы "UPDATE"
  • EndElement status
  • символы ""
  • EndElement item
+0

Так просто! Не могу поверить, что я этого не замечал. +1 и принято. – SnakeDoc