转换时保留 unicode 字符 XML
Preserve unicode character while transoforming XML
我有一份 XML 文件。我使用 Java 的 DocumentBuilder 阅读了这份文档。然后我在 DOM 上做一些更新。然后我尝试用 Transformer 保存这个 XML-representation。在最后一步我遇到了问题。
原始 XML 文档包含一些 unicode 字符,例如
。当我尝试用 Java 的转换器保存这个 XML 文档时,这个字符在最终文件中变成了简单的换行符。
当我将 XML 保存到文件中时,如何保留那些 unicode 字符?
提前致谢!
字符不只是'lost'。我假设 (?) 是 unicode 字符 'deformed' 读取或写入流。
确保您对流(InputStreamReader、OutputStreamWriter)使用正确的编码,或者在您自己显示转换后的结果时。
g.
你不能。 DOM 不知道哪些字符在原始来源中表示为文字字符,哪些字符表示为字符引用,因此不可能 "preserve" 它们 - 信息根本不存在。序列化程序将为输出字符编码中无法表示的任何字符使用字符引用,但通常会尽可能使用文字字符。
它唯一一次使用
作为换行符是在属性值内部,下一次解析文件时文字换行符将被规范化为空格。
Original XML document contains some unicode characters, for example
.
&#...;
语法称为数字字符引用。
与 Unicode 无关(除了所有 ASCII 字符,包括控制代码 10,也是 Unicode 字符)。
When I try to save this XML document with Java's Transformer, this character becomes simple line-break in the final file.
换行符和
字符引用表示文本内容中的相同数据(*)。 DocumentBuilder
解析时差异已被丢弃,并且适用于任何符合 XML 规范的解析器。
XML 解析器通常不会保留 infoset 中不存在的输入文档的信息,因此在不进行更改的情况下解析和序列化同一文档并不能保证输入和输出将是相同的。差异包括属性顺序、标签内的间距、属性值周围使用哪些引号,以及文本字符 >
是否写为 >
、>
、>
、>
、>
或 >
,或...
好消息是几乎没有任何理由去关心。如果要读取你的输出的东西也是一个 XML 解析器,它也看不出换行符和
字符引用之间的任何区别。
(*: 这在属性值内容中不一定总是正确的)
此库 returns Stax2 XML带有原始文本的事件,按原样保留 unicode 引用。
https://github.com/irgaly/original-characters-stax-xml-parser
(编辑)
进一步说明:
您可以使用 JDK 的 StAX 解析器、XMLEventReader 和 XMLEvent。
XML事件有 getLocation(),它是元素起始位置的字符偏移量。然后你可以从输入 XML String.
中得到原始字符串
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()
我有一份 XML 文件。我使用 Java 的 DocumentBuilder 阅读了这份文档。然后我在 DOM 上做一些更新。然后我尝试用 Transformer 保存这个 XML-representation。在最后一步我遇到了问题。
原始 XML 文档包含一些 unicode 字符,例如
。当我尝试用 Java 的转换器保存这个 XML 文档时,这个字符在最终文件中变成了简单的换行符。
当我将 XML 保存到文件中时,如何保留那些 unicode 字符?
提前致谢!
字符不只是'lost'。我假设 (?) 是 unicode 字符 'deformed' 读取或写入流。
确保您对流(InputStreamReader、OutputStreamWriter)使用正确的编码,或者在您自己显示转换后的结果时。
g.
你不能。 DOM 不知道哪些字符在原始来源中表示为文字字符,哪些字符表示为字符引用,因此不可能 "preserve" 它们 - 信息根本不存在。序列化程序将为输出字符编码中无法表示的任何字符使用字符引用,但通常会尽可能使用文字字符。
它唯一一次使用
作为换行符是在属性值内部,下一次解析文件时文字换行符将被规范化为空格。
Original XML document contains some unicode characters, for example
.
&#...;
语法称为数字字符引用。
与 Unicode 无关(除了所有 ASCII 字符,包括控制代码 10,也是 Unicode 字符)。
When I try to save this XML document with Java's Transformer, this character becomes simple line-break in the final file.
换行符和
字符引用表示文本内容中的相同数据(*)。 DocumentBuilder
解析时差异已被丢弃,并且适用于任何符合 XML 规范的解析器。
XML 解析器通常不会保留 infoset 中不存在的输入文档的信息,因此在不进行更改的情况下解析和序列化同一文档并不能保证输入和输出将是相同的。差异包括属性顺序、标签内的间距、属性值周围使用哪些引号,以及文本字符 >
是否写为 >
、>
、>
、>
、>
或 >
,或...
好消息是几乎没有任何理由去关心。如果要读取你的输出的东西也是一个 XML 解析器,它也看不出换行符和
字符引用之间的任何区别。
(*: 这在属性值内容中不一定总是正确的)
此库 returns Stax2 XML带有原始文本的事件,按原样保留 unicode 引用。
https://github.com/irgaly/original-characters-stax-xml-parser
(编辑)
进一步说明:
您可以使用 JDK 的 StAX 解析器、XMLEventReader 和 XMLEvent。
XML事件有 getLocation(),它是元素起始位置的字符偏移量。然后你可以从输入 XML String.
中得到原始字符串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()