Java中如何将DOMImplementationLS序列化为UTF-8字符串

15

阅读Java org.w3c.dom.ls文档,似乎只能使用Java本机字符串编码UTF-16将Element序列化为String。 但我需要创建一个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);

2
@Tomas - Java字符串并不存在UTF-8格式。我认为任何试图将UTF-8编码的字节强制转换为char类型的尝试都会以失败告终。 - McDowell
2个回答

18

你仍然可以使用 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();

9

我发现将DOM序列化为字符串的最灵活的方法是使用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而无需配置? - Tomas
这取决于您使用的“Writer”实现。我想,“StringWriter”默认为UTF-8。 - skaffman
1
@skaffman - “StringWriter只是默认为UTF-8”。您错了。字符串是UTF-16;转换器可能会添加一个XML头,其中包含<?xml version="1.0" encoding="UTF-8"?>,但这与任何实际的编码操作无关。 - McDowell
1
对我也起作用了 - 另一个有UTF-16的东西,导致在尝试使用文档构建器解析时出现“内容不允许在前言中”的错误。 - Nicholas DiPiazza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接