当前位置: 首页 > 面试题库 >

使用Xerces将DOM序列化为FileOutputStream

公良俊楚
2023-03-14
问题内容

我正在使用此链接来使用DOM生成XML文件。它说:“ Xerces解析器与JDK
1.5发行版捆绑在一起。因此,您不必单独下载解析器。”

但是,当我在Eclipse Helios中编写以下行时,即使系统中装有Java 1.6,也会出现编译时错误。

import org.apache.xml.serialize.XMLSerializer;

为什么会这样呢?


问题答案:

Xerces确实与JDK捆绑在一起,但是您应该将其与JAXP API一起使用javax.xml.parsers。检查以下程序的输出。

另外,要序列化XML Document,应使用DOM Level 3 Load and
Save(在JDK中存在)或不带样式表的XSLT转换(标识转换)。其余的取决于特定的实现。Xerces XMLSerializer已弃用:

不推荐使用。Xerces 2.9.0中不推荐使用该类。建议新应用程序使用DOM Level 3
LSSerializer或JAXP的XML转换API(TrAX)来序列化XML。有关更多信息,请参见Xerces文档。

这是使用DOM级别3进行序列化的示例:

import org.w3c.dom.*;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.*;

public class DOMExample3 {

    public static void main(String[] args) throws Exception {
        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();    
        DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("XML 3.0 LS 3.0");
        if (impl == null) {
            System.out.println("No DOMImplementation found !");
            System.exit(0);
        }

        System.out.printf("DOMImplementationLS: %s\n", impl.getClass().getName());

        LSParser parser = impl.createLSParser(
                DOMImplementationLS.MODE_SYNCHRONOUS,
                "http://www.w3.org/TR/REC-xml");
        // http://www.w3.org/2001/XMLSchema
        System.out.printf("LSParser: %s\n", parser.getClass().getName());

        if (args.length == 0) {
            System.exit(0);
        }

        Document doc = parser.parseURI(args[0]);

        LSSerializer serializer = impl.createLSSerializer();
        LSOutput output = impl.createLSOutput();
        output.setEncoding("UTF-8");
        output.setByteStream(System.out);
        serializer.write(doc, output);
        System.out.println();
    }
}

这是身份转换的示例:

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class DOMExample2 {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder parser = factory.newDocumentBuilder();

        System.out.println("Parsing XML document...");
        Document doc;
        doc = parser.parse(args[0]);

        // Xerces Java 2

        /* Deprecated. This class was deprecated in Xerces 2.9.0.
         * It is recommended that new applications use the DOM Level 3
         * LSSerializer or JAXP's Transformation API for XML (TrAX)
         * for serializing XML and HTML.
         * See the Xerces documentation for more information.
         */  
        /*
        System.out.println("XERCES: Displaying XML document...");
        OutputFormat of = new OutputFormat(doc, "ISO-8859-1", true);
        PrintWriter pw = new PrintWriter(System.out);
        BaseMarkupSerializer bms = new XMLSerializer(pw, of);
        bms.serialize(doc);
*/
        // JAXP

        System.out.println("JAXP: Displaying XML document...");
        TransformerFactory transFactory = TransformerFactory.newInstance();
        System.out.println(transFactory.getClass().getName());
        //transFactory.setAttribute("indent-number", 2);
        Transformer idTransform = transFactory.newTransformer();
        idTransform.setOutputProperty(OutputKeys.METHOD, "xml");
        idTransform.setOutputProperty(OutputKeys.INDENT,"yes");
        // Apache default indentation is 0
        idTransform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");                
        Source input = new DOMSource(doc);
        Result output = new StreamResult(System.out);
        idTransform.transform(input, output);
    }
}


 类似资料:
  • 文档对象模型是万维网联盟(W3C)的官方建议。 它定义了一个接口,使程序能够访问和更新XML文档的样式,结构和内容。 支持DOM的XML解析器,实现该接口。 什么时候用? 你应该使用DOM解析器 - 您需要了解很多关于文档结构的知识。 您需要移动文档的一部分(例如,您可能希望对某些元素进行排序)。 您需要多次使用文档中的信息。 你得到什么? 使用DOM解析器解析XML文档时,将返回包含文档所有元素

  • 我在尝试“反序列化”对象时遇到以下错误: 我需要能够使用这个XStream库序列化/反序列化对象,甚至是那些没有参数构造函数的对象。

  • 问题内容: 如果我做: 包含一个空对象,而不是iframe元素,为什么? 问题答案: JSON( JavaScript对象 表示法) 不是 为序列化DOM节点 而 设计的,您需要自己拉出所需的内容并将其写入对象,然后根据需要重新创建DOM节点。 实际上,Chrome甚至不执行您的代码:

  • 问题内容: 我正在客户端和Django服务器之间发送信息,并且我想对此使用JSON。我正在发送简单的信息-字符串列表。我尝试使用,但是当我这样做时, 看来这只能用于Django对象。如何序列化简单的Python对象? 问题答案: 你可以使用纯Python执行此操作:

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 问题在于,每次执行main方法时,a.xml的旧内容都会丢失,并被新的内容替代。如何在不丢失先前信息的情况下将内容附加到a.xml文件? 问题答案: 样例代码