【问题标题】:XML processing instructionsXML 处理指令
【发布时间】:2023-03-03 00:10:01
【问题描述】:

以下代码

import java.io.File;
import java.io.FileReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception  {
        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("out.xml"));
        xsr.nextTag(); // Advance to statements element

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {

            t.transform(new StAXSource(xsr), new StreamResult("result.txt"));
        }
    }
} 

产生一些txt,在它的第一行有处理指令(<?xml version="1.0">)。它们来自哪里以及如何摆脱它们?以及如何操纵它们?

【问题讨论】:

    标签: java xml


    【解决方案1】:

    您可以通过在转换器上设置 output properties 来禁用 xml 声明的创建:

    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    

    如果您想从 xml 生成文本文件,那么您可能想在 TransformerFactory.newInstance 调用中指定 XSLT 源并在该 XSLT 中设置输出属性。

    【讨论】:

    • 错错了。理论上它应该工作,但它没有。检查this 问题。这是我遇到的问题
    • 这个问题似乎是关于使用StaxResult,甚至说使用StreamResult 时省略了xml decl。但我实际上并没有运行代码来验证这一点。
    • 是的,你是对的。你看,最初我的任务是弄清楚如何通常摆脱 xml 声明,而你回答了这个问题。但是在我的代码中,我使用的是 stax 结果,因此,虽然它与演示一起使用,但它并没有与我的代码一起使用。它确实适用于 StreamResult
    • 但这是一个不同的问题,所以,猜猜这是答案
    【解决方案2】:

    <?xml version="1.0"?> 行是一个 xml 声明。根据W3C XML Recommendation

    XML 文档应该以一个 XML 声明开头,该声明指定正在使用的 XML 版本。

    它应该在那里(尽管不是强制性的)。

    顺便说一句。在严格的技术意义上,它不是一个处理指令。

    编辑:可以通过以下方式更改编码:

    t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    

    【讨论】:

    • 我的意思是它是如何出现在我的 txt 中的?如果我希望它是 <?xml version="1.0" encoding="UTF-8" ,但出现 <?xml version="1.0"?> 是因为“它应该在那里”
    • 谢谢。如果你知道如何解决this,那也太酷了
    • 错错了。理论上它应该工作,但它没有。检查this 问题。这是我遇到的问题
    猜你喜欢
    • 2022-11-29
    • 2012-01-17
    • 1970-01-01
    • 2023-03-16
    • 2017-12-24
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多