1

我想使用 XMLStreamReader 来读取包含 Horizo​​ntal Tab ASCII Codes 的 XML 文件	,例如:

<tag>foo&#009;bar</tag>

并打印出来或写回另一个 xml 文件。

谷歌告诉我设置javax.xml.stream.isCoalescingtruein XMLInputFactory,但我下面的测试代码没有按预期工作。

public static void main(String[] args) throws IOException, XMLStreamException {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    factory.setProperty(factory.IS_COALESCING, true);

    System.out.println("IS_COALESCING supported ? " + factory.isPropertySupported(factory.IS_COALESCING));
    System.out.println("factory IS_COALESCING value is " +factory.getProperty(factory.IS_COALESCING));

    String rawString = "<tag>foo&#009;bar</tag>";
    XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(rawString));
    System.out.println("reader IS_COALESCING value is " +reader.getProperty(factory.IS_COALESCING));

    PrintWriter pw = new PrintWriter(System.out, true);
    while (reader.hasNext())
    {
        reader.next();
        pw.print(reader.getEventType());
        if (reader.hasText())
            pw.append(' ').append(reader.getText());
        pw.println();
    }
}

输出是

IS_COALESCING supported ? true
factory IS_COALESCING value is true
reader IS_COALESCING value is true
1
4 foo   bar
2
8

但我想保持相同的水平选项卡,如:

IS_COALESCING supported ? true
factory IS_COALESCING value is true
reader IS_COALESCING value is true
1
4 foo&#009;bar
2
8

我在这里想念什么?谢谢

4

1 回答 1

1

据我所知,解析部分是正确的——它只是没有像你想象的那样打印出来。XML 阅读器将您的 unicode 编码解释为\tJava 并相应地表示。

使用 Guava 的 XmlEscapers,我可以产生类似于你想要的东西:

public class Test {
    public static void main(String[] args) throws IOException, XMLStreamException {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, true);

        System.out.println("IS_COALESCING supported ? " + factory.isPropertySupported(XMLInputFactory.IS_COALESCING));
        System.out.println("factory IS_COALESCING value is " + factory.getProperty(XMLInputFactory.IS_COALESCING));

        String rawString = "<tag>foo&#009;bar</tag>";
        XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(rawString));
        System.out.println("reader IS_COALESCING value is " + reader.getProperty(XMLInputFactory.IS_COALESCING));

        PrintWriter pw = new PrintWriter(System.out, true);
        while (reader.hasNext()) {
            reader.next();
            pw.print(reader.getEventType());
            if (reader.hasText()) {
                pw.append(' ').append(XmlEscapers.xmlAttributeEscaper().escape(reader.getText()));
            }
            pw.println();
        }
    }

输出如下所示:

IS_COALESCING supported ? true
factory IS_COALESCING value is true
reader IS_COALESCING value is true
1
4 foo&#x9;bar
2
8

对此的一些评论:

  • 库本身被标记为不稳定,可能还有其他选择
  • \t不需要在 XML 内容中进行转义,因此我不得不选择属性转换器。虽然它有效,但可能会有一些副作用
  • 真的需要 100% 的内容副本吗?否则,我建议让 XML 库完成它们的工作并让它们创建正确的编码。
    • 如果您真的想要 1:1 副本,是否可以选择将输入指定为CDATA
于 2019-10-29T12:51:44.617 回答