如何用多个字符实体解析XML?

时间:2015-06-13 01:51:29

标签: java xml sax

我有一个XML文件,声明它使用的是utf-8。 当我在VIM中打开文件时,我看到类似

的内容
class EventsController < ApplicationController
    ...
    def create
        @tutor = current_tutor
        @event = @tutor.events.build(event_params)

        respond_to do |format|
          if @event.save
            format.html { redirect_to @event, notice: 'Event was successfully created.' }
            format.json { render :show, status: :created, location: @event }
          else
            format.html { render :new }
            format.json { render json: @event.errors, status: :unprocessable_entity }
          end
        end
    end
    ...
    def event_params
      params[:start_time] = params[:start]
      params[:end_time] = params[:end]

      params.permit(:title, :description, :start_time, :end_time, :url, :type)
    end
end

我正在使用Java 1.6.0_41的SAXParser并且在使用这些数据时,解析器基本上没有看到格式错误的文字并跳过它们或似乎将格式错误的字符视为&# 34;内容&#34; <?xml version="1.0" encoding="UTF-8"?> <r> <first-tag>foo</first-tag> <second-tag> &lt;a-tag-nested-in-second-tag&gt;some data&lt;/a-tag-nested-in-second-tag&gt; </second-tag> ... </r> 的数据。

以下是我如何使用数据

second-tag

SAX是否有办法将嵌套的转义XML数据视为真正的XML标记而不仅仅是File f = ... SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); stream = new FileInputStream(f); AbstractHandler handler = ... parser.parse(new InputSource(stream), handler); 的数据?

1 个答案:

答案 0 :(得分:1)

UTF-8是character encoding。在单个文件中使用多个字符编码是没有意义的,也不会显示任何具有多个字符编码的证据。

您展示的内容包括多个 字符实体引用 ,例如&lt;&gt;。这些不是问题,尽管它们可能表明(有意或无意)转义 XML标记的输出。

的问题在于,您的“XML”缺少单个根元素,因此不是well-formed

如果您为标记提供单个根元素,

<?xml version="1.0" encoding="UTF-8"?>
<r>
  <first-tag>foo</first-tag>
  <second-tag>
    &lt;a-tag-nested-in-second-tag&gt;some data&lt;/a-tag-nested-in-second-tag&gt;
  </second-tag>
</r>

XML解析器可以很好地解析它。

每条评论更新和更新的问题

  

SAX是否有办法真正处理嵌套的转义xml数据   xml标记而不仅仅是“second-tag”的数据?

不,没有一个简单的配置标志可以指示SAX将转义的XML视为常规XML。 SAX将正确地将转义的XML数据视为字符和字符实体引用。您的选择包括通过

解决上游问题
  1. 取消您希望保留的XML的转义,或
  2. 对转义的XML数据进行后处理以重新建立原始数据 XML。
  3. 请注意,选项#2本身可能涉及一个基于SAX的解析器,它的实体处理程序是您为重建原始XML而设计的。

    另见how to unescape XML in java