【问题标题】:DOMImplementationLS serialize to String in UTF-8 in JavaDOMImplementationLS 在 Java 中以 UTF-8 序列化为字符串
【发布时间】:2010-12-10 20:14:07
【问题描述】:

阅读 java org.w3c.dom.ls 的文档,似乎只能将元素序列化为使用 java 本机字符串编码 UTF-16 的字符串。但是,我需要创建一个 UTF-8 字符串,无论是否转义,我知道它仍然是一个 UTF-16 字符串。有人有办法解决这个问题吗? 我需要将字符串传递给生成的 WS 客户端,该客户端将使用该字符串,那么它应该是 UTF-8。

我用来创建字符串的代码:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry.
DOMImplementationLS domImplementationLS = (DOMImplementationLS) REGISTRY.getDOMImplementation("LS");
LSSerializer writer = domImplementationLS.createLSSerializer();
String result = writer.writeToString(element);

【问题讨论】:

  • @Tomas - 没有 UTF-8 Java 字符串这样的东西。我希望任何将 UTF-8 编码字节强制转换为 char 类型的尝试都会以泪水告终。

标签: java xml dom xml-serialization


【解决方案1】:

你仍然可以使用DOMImplementationLS:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry.
DOMImplementationLS domImplementationLS = (DOMImplementationLS)REGISTRY.getDOMImplementation("LS");
LSOutput lsOutput =  domImplementationLS.createLSOutput();
lsOutput.setEncoding("UTF-8");
Writer stringWriter = new StringWriter();
lsOutput.setCharacterStream(stringWriter);
lsSerializer.write(doc, lsOutput);     
String result = stringWriter.toString();

【讨论】:

    【解决方案2】:

    我发现将 DOM 序列化为 String 最灵活的方法是使用 javax.xml.transform API:

        Node node = ...
        StringWriter output = new StringWriter();
    
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(node), new StreamResult(output));
    
        String xml = output.toString();
    

    它不是特别优雅,但它应该让您更好地控制输出编码。

    【讨论】:

    • 很有魅力,但我如何设置显式编码,这会生成没有配置的 UTF-8?
    • 这取决于您使用的Writer 实现。我认为StringWriter 恰好默认为 UTF-8。
    • @skaffman - “StringWriter 恰好默认为 UTF-8”。你误会了。字符串是 UTF-16;转换器可能会添加一个表示<?xml version="1.0" encoding="UTF-8"?> 的 XML 标头,但这与任何实际的编码操作无关。
    • 也为我工作 - 另一个有 UTF-16 内容,在尝试使用文档构建器解析时导致“prolog 中不允许的内容”错误。
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2011-08-16
    • 2019-07-20
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多