У меня есть пример смешанного содержимого 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'?
является SAX требования? Для содержимого смешивания обработка возвращаемых текстовых узлов может стать беспорядочной? Вы считали XPath, что упростит и упростит запись? –