2

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

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

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

getPITarget()
getPIData()

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

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

3 回答 3

3

1.XML格式是否正确?

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

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

是的。

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

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

于 2009-01-01T00:59:25.433 回答
0

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

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

据我所知,不幸的是,没有一个 Java xml 解析器或处理包支持这种用法。

于 2009-02-10T20:43:25.840 回答
0

尽管Dimitre 的回答在技术上是正确的,但一些流行的库现在可以按预期解析处理指令伪属性。后续示例解析以下 XML 处理指令以获取hrefpseduo-attribute 的值:

<?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" ) );
  }
}
于 2016-12-17T20:34:52.270 回答