如何使用Java StAX格式化和读取XML处理指令?

首先,我如何格式化XML处理指令,它是:

 

使用StAX,然后我想通过处理XMLStreamConstants.PROCESSING_INSTRUCTION ( javadoc )事件来读取它,但它只提供两个方法然后从XMLStreamReader检索有关处理指令的信息:

 getPITarget() getPIData() 

这两种方法的javadoc不是很有帮助。

  1. XML格式是否正确?
  2. 这是使用StAX XMLStreamReader API解析处理指令的正确方法吗?
  3. 如何使用getPITarget()getPIData()返回多个参数?

1. XML格式是否正确?

是的 ,但请注意, 处理指令没有属性 – 只有数据。 看起来像属性的是数据的一部分,有些人称它们为“ pseudo-attributes ”。

2.这是使用StAX XMLStreamReader API解析处理指令的正确方法吗?

是。

3.如何使用getPITarget()和getPIData()返回多个参数?

如果通过“多个参数”表示数据中包含的可能不止一个伪属性,答案是您的代码必须解析数据(使用一些标准字符串方法作为C# split() ,并检索名称集 – 所有伪属性的值对。

我认为这种处理指令具有属性的概念来自一些旧的xml手册。 有人曾讨论过推荐PI来尊重或要求这样的结构。 但是,官方的xml规范从未强制要求甚至推荐这种用法。

所以基本上你必须自己解析内容 – 它们可能是任何格式,但如果你知道它使用属性表示法,你可以解析它。

据我所知,遗憾的是,Java xml解析器或处理包都不支持这种用法。

虽然Dimitre的答案在技​​术上是正确的,但是一些流行的库现在正在解析处理指令伪属性。 后续示例解析以下XML处理指令以获取href pseduo-attribute的值:

  

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" ) ); } } 

撒克逊

使用Saxon :

 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" ) ); } }