【问题标题】:How to read/write Java ASCII Characters value with XMLStreamReader?如何使用 XMLStreamReader 读取/写入 Java ASCII 字符值?
【发布时间】:2019-10-21 09:22:40
【问题描述】:

我想使用 XMLStreamReader 来读取包含水平制表符 ASCII 码 	 的 XML 文件,例如:

<tag>foo	bar</tag>

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

Google 告诉我在XMLInputFactory 中将javax.xml.stream.isCoalescing 设置为true,但我下面的测试代码没有按预期工作。

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

我在这里缺少什么?谢谢

【问题讨论】:

    标签: java ascii xmlstreamreader xml-encoding xmlencoder


    【解决方案1】:

    据我所知,解析部分是正确的——它只是没有按照您的设想打印。 XML 阅读器将您的 unicode 编码解释为 \t,并在 Java 中相应地表示。

    使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2015-05-08
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多