Как форматировать и читать инструкции по обработке XML с помощью Java StAX?
Вопрос
Во-первых, как мне отформатировать инструкцию обработки XML? Это:
<?processingInstructionName attribute="value" attribute2="value2"?>
Используя StAX, я затем хочу прочитать его, обработав XMLStreamConstants.PROCESSING_INSTRUCTION
(Javadoc) событие, но оно предоставляет только два метода для последующего получения информации об инструкции обработки из XMLStreamReader
:
getPITarget()
getPIData()
А Javadoc эти два метода не очень полезны.
- Правильно ли форматирование XML?
- Это правильный способ провести инструкции по обработке анализа с использованием Stax
XMLStreamReader
API? - Как мне использовать
getPITarget()
иgetPIData()
вернуть несколько аргументов?
Решение
1.Правильно ли форматирование XML?
Да, однако обратите внимание, что инструкция обработки не имеет атрибуты -- только данные.То, что выглядит как атрибуты, является частью данных, и некоторые люди называют их «pseudo-attributes
".
2. Правильный ли это способ анализа инструкций обработки с использованием API-интерфейсов StAX XMLStreamReader?
Да.
3.Как использовать getPITarget() и getPIData() для возврата нескольких аргументов?
Если под «множественными аргументами» вы подразумеваете, возможно, более одного псевдоатрибута, содержащегося в данных, ответ заключается в том, что ваш код должен анализировать данные (используя некоторые стандартные строковые методы, такие как C# split()
, и получите набор пар имя-значение для всех псевдоатрибутов.
Другие советы
Я думаю, что идея обработки инструкций, имеющих атрибуты, взята из некоторых старых руководств по XML.В какой-то момент обсуждалась необходимость рекомендовать ИП соблюдать или требовать такого структурирования.Однако официальная спецификация XML никогда не требовала и даже не рекомендовала такое использование.
Так что, по сути, вам придется анализировать содержимое самостоятельно — оно может быть в любом формате, но если вы знаете, что оно использует нотацию атрибутов, вы можете его проанализировать.
Насколько мне известно, ни один из XML-парсеров или пакетов обработки Java, к сожалению, не поддерживает такое использование.
Хотя Ответ Дмитрия технически правильно, несколько популярных библиотек теперь анализируют псевдоатрибуты инструкций обработки, как и следовало ожидать.В последующих примерах анализируется следующая инструкция обработки XML, чтобы получить значение для href
псевдоатрибут:
<?xml-stylesheet type="text/xsl" href="markdown.xsl"?>
JDOM2
С использованием JDOM2:
import org.jdom2.ProcessingInstruction;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
final ProcessingInstruction pi = new ProcessingInstruction( target, data );
System.out.println( pi.getPseudoAttributeValue( "href" ) );
}
}
саксонский
С использованием саксонский:
import static net.sf.saxon.tree.util.ProcInstParser.getPseudoAttribute;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
System.out.println( getPseudoAttribute( data, "href" ) );
}
}