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

时间:2008-12-31 22:11:11

标签: java xml stax

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

<?processingInstructionName attribute="value" attribute2="value2"?>

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

getPITarget()
getPIData()

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

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

3 个答案:

答案 0 :(得分:3)

  

1. XML格式是否正确?

,但请注意processing instruction没有attributes - 仅限数据。看似属性的内容是数据的一部分,有些人称之为“pseudo-attributes”。

  

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

  

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

尽管Dimitre's answer在技术上是正确的,但现在一些流行的库正在解析处理指令伪属性。后续示例解析以下XML处理指令以获取href pseduo属性的值:

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

撒克逊

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