【问题标题】:How do I format and read XML processing instructions using Java StAX?如何使用 Java StAX 格式化和读取 XML 处理指令?
【发布时间】:2008-12-31 22:11:10
【问题描述】:

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

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

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

getPITarget()
getPIData()

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

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

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    1.XML格式是否正确?

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

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

    是的。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        尽管Dimitre's answer 在技术上是正确的,但一些流行的库现在可以按预期解析处理指令伪属性。后续示例解析以下 XML 处理指令以获取 href pseduo-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" ) );
          }
        }
        

        撒克逊人

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

        【讨论】:

          猜你喜欢
          • 2011-02-26
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 2020-09-08
          • 2017-06-07
          相关资源
          最近更新 更多