【问题标题】:Preserve unicode character while transoforming XML在转换 XML 时保留 unicode 字符
【发布时间】:2015-03-18 20:27:04
【问题描述】:

我有一个 XML 文档。我用 Java 的 DocumentBuilder 阅读了这个文档。然后我对 DOM 做了一些更新。然后我尝试用 Transformer 保存这个 XML 表示。在最后一步我遇到了一个问题。 原始 XML 文档包含一些 unicode 字符,例如 
。当我尝试使用 Java 的 Transformer 保存这个 XML 文档时,这个字符在最终文件中变成了简单的换行符。

当我将 XML 保存到文件中时,如何保留这些 un​​icode 字符?

提前谢谢你!

【问题讨论】:

    标签: java xml unicode xml-parsing


    【解决方案1】:

    原始 XML 文档包含一些 unicode 字符,例如


    &#...; 语法称为数字字符引用。 
 未连接到 Unicode(除了所有 ASCII 字符,包括控制代码 10,也是 Unicode 字符)。

    当我尝试使用 Java 的 Transformer 保存这个 XML 文档时,这个字符在最终文件中变成了简单的换行符。

    换行符和
 字符引用表示文本内容(*) 中的相同数据。在DocumentBuilder 解析时,差异已经被丢弃,并且适用于任何符合 XML 规范的解析器。

    一般来说,XML 解析器不会保留输入文档中不存在于 infoset 中的信息,因此在不更改的情况下解析和序列化同一文档并不能保证输入和输出是相同的。差异包括属性顺序、标签内的间距、属性值周围使用的引号以及文本字符 > 是否写为 >>>>> 或 @ 987654333@,或者...

    好消息是几乎没有任何理由关心。如果要读取您的输出的东西也是 XML 解析器,那么它也看不出换行符和 
 字符引用之间的任何区别。

    (*: 这在属性值内容中不一定总是正确的)

    【讨论】:

      【解决方案2】:

      你不能。 DOM 不知道原始源中哪些字符表示为文字字符,哪些表示为字符引用,因此不可能“保存”它们——信息根本不存在。序列化程序将对在输出字符编码中无法表示的任何字符使用字符引用,但通常会尽可能使用文字字符。

      它唯一一次将
 用于换行符是在属性值内部,其中文字换行符将在下次解析文件时标准化为空格。

      【讨论】:

        【解决方案3】:

        角色不只是“丢失”。我假设(?)是 unicode 字符“变形”读取或写入流。

        确保对流(InputStreamReader、OutputStreamWriter)或在显示转换结果时使用正确的编码。

        g.

        【讨论】:

          【解决方案4】:

          这个库返回带有原始文本的 Stax2 XMLEvent,保留 unicode 引用。

          https://github.com/irgaly/original-characters-stax-xml-parser


          (编辑)

          进一步解释:

          您可以使用 JDK 的 StAX Parser、XMLEventReader 和 XMLEvent。

          XMLEvent 具有 getLocation() ,它是元素起始位置的字符偏移量。然后就可以从输入的 XML 字符串中获取原始字符串了。

          https://docs.oracle.com/en/java/javase/11/docs/api/java.xml/javax/xml/stream/XMLEventReader.html https://docs.oracle.com/en/java/javase/11/docs/api/java.xml/javax/xml/stream/events/XMLEvent.html#getLocation()

          【讨论】:

          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
          • 好的。我更新了我的帖子。
          猜你喜欢
          • 2013-08-08
          • 1970-01-01
          • 2015-06-15
          • 2011-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多