【问题标题】:Can the Java streaming XML parser distinguish empty element from self-closing empty element?Java 流式 XML 解析器能否区分空元素和自闭合空元素?
【发布时间】:2017-02-03 10:58:28
【问题描述】:

Java流式XML解析器,即javax.xml.stream.XMLEventReader能否区分空元素

<document>
  <empty></empty>
<document>

来自一个自闭合的空元素?

<document>
  <empty/>
<document>

假设我们解析上述两个 xml 片段并打印 eventType 和事件本身,就像这样:

System.out.println("eventType:" + event.getEventType() + "; element:"+event.toString());

以上两个片段都会产生完全相同的结果:

eventType:7; element:<?xml version="null" encoding='null' standalone='no'?>
eventType:1; element:<document>
eventType:4; element:   
eventType:1; element:<empty>
eventType:2; element:</empty>
eventType:2; element:</document>
eventType:8; element:ENDDOCUMENT 

只是给出一些上下文,我们想要实现的是,我们想根据一些规则重写xml的某些部分,但希望保留其他部分原样,即保留空元素尽管这两种形式在语义上是相同的,但在它们的原始形式中。如果我们有一个普通的空元素(第一个例子),我们希望保持这种状态,如果我们有一个自闭合的空元素,我们也想在结果中写入一个自闭合的元素。我们可以通过javax.xml.stream.XMLEventReader 实现这个目标吗?

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    答案是否定的。同样,您不能在标签中保留空格(例如,属性值之间的换行符,或“=”符号周围的空格)。这些被认为对应用程序不感兴趣,因此不予报告。

    【讨论】:

    【解决方案2】:

    你可以测试 startevent 和 endevent 是否有相同的位置

    event.getLocation().getCharacterOffset();
    

    来自 javadoc

    将字节或字符偏移量返回到该位置指向的输入源中。如果输入源是文件或字节流,则这是该流中的字节偏移量,但如果输入源是字符媒体,则偏移量是字符偏移量。如果没有可用的偏移量,则返回 -1。

    不保证偏移量可用,但这应该取决于您的设置,如果它适用于您的设置,值得一试。 (而且它只能表示最大为Integer.MAX_VALUE的偏移量)

    【讨论】:

    • getLocation() 不存在。
    • 我想我的意思是event.getLocation().getCharacterOffset();我改变了我的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多