2017-02-03 6 views
0

Может Java потоковый XML-парсер, то есть javax.xml.stream.XMLEventReader отличить пустой элементМожет ли потоковый XML-анализатор Java отличать пустой элемент от самозакрывающегося пустого элемента?

<document> 
    <empty></empty> 
<document> 

от самозакрывания пустого элемента?

<document> 
    <empty/> 
<document> 

Давайте предположим, что мы разбираем оба указанных выше фрагментов XML и печати типСобытия и само событие, так же, как это:

System.out.println("eventType:" + event.getEventType() + "; element:"+event.toString()); 

Оба указанных выше фрагментов будет производить тот же результат:

eventType:7; element:<?xml version="null" encoding='null' standalone='no'?> 
eventType:1; element:<document> 
eventType:4; element: 
eventType:1; element:<empty> 
eventType:2; element:</empty> 
eventType:2; element:</document> 
eventType:8; element:ENDDOCUMENT 

Для того, чтобы дать некоторый контекст, мы хотим переписать некоторые части xml на основе некоторых правил, но хотим сохранить другие части точно так, как они есть, то есть, мы хотим сохранить пустые элементы в их первоначальном виде, хотя две формы семантически одинаковы. Если у нас есть обычный пустой элемент (1-й пример), мы хотим сохранить его таким образом, если у нас есть самозакрывающийся пустой элемент, мы хотим также написать самозакрывающийся элемент в результате. Можем ли мы достичь этой цели с помощью javax.xml.stream.XMLEventReader?

ответ

1

Ответ отрицательный. Аналогично, вы не можете сохранять пробелы внутри тега (например, новые строки между значениями атрибутов или пробелы вокруг знака «=»). Они считаются не интересными для приложений и поэтому не сообщаются.

+0

Michael, спасибо за ваш ответ. Не могли бы вы взглянуть на этот следующий вопрос? http://stackoverflow.com/questions/42025027/is-there-an-efficient-streaming-xml-parser-in-java-that-would-preserve-the-exact – bpgergo

0

Вы можете проверить, если startevent и EndEvent имеют одинаковое расположение

reader.getLocation().getCharacterOffset(); 

От Javadoc

Верните байт или символьной смещение в источник входного сигнала это местоположение, указывающий на. Если источником входных данных является файл или поток байтов, то это смещение байта в этот поток, но если источником ввода является мультимедийный носитель, тогда смещение является смещением символов. Возвращает -1, если смещение отсутствует.

Смещение не гарантируется, но оно должно зависеть от вашей установки и стоит попробовать, если она будет работать в вашей. (Также он может представлять только смещения до Integer.MAX_VALUE)