关于java:如何从XML字符串中加载org.w3c.dom.Document?

关于java:如何从XML字符串中加载org.w3c.dom.Document?

How do I load an org.w3c.dom.Document from XML in a string?

我在字符串中有一个完整的XML文档,想要一个Document对象。 Google会产生各种垃圾。 什么是最简单的解决方案? (在Java 1.5中)

解决方案感谢Matt McMinn,我决定完成此实现。 对我来说,它具有适当级别的输入灵活性和异常粒度。 (很高兴知道错误是来自格式错误的XML-SAXException-还是来自错误的IO-IOException。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static org.w3c.dom.Document loadXMLFrom(String xml)
    throws org.xml.sax.SAXException, java.io.IOException {
    return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}

public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is)
    throws org.xml.sax.SAXException, java.io.IOException {
    javax.xml.parsers.DocumentBuilderFactory factory =
        javax.xml.parsers.DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    javax.xml.parsers.DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    }
    catch (javax.xml.parsers.ParserConfigurationException ex) {
    }  
    org.w3c.dom.Document doc = builder.parse(is);
    is.close();
    return doc;
}

哇!

此代码可能存在严重的问题,因为它会忽略String中指定的字符编码(默认为UTF-8)。调用String.getBytes()时,平台默认编码用于将Unicode字符编码为字节。因此,解析器可能认为它实际上正在获取UTF-8数据,而实际上它正在获取EBCDIC或不漂亮的东西!

相反,使用带InputSource的parse方法,可以使用Reader构造它,如下所示:

1
2
3
4
import java.io.StringReader;
import org.xml.sax.InputSource;

        return builder.parse(new InputSource(new StringReader(xml)));

看起来似乎没什么大不了,但是对字符编码问题的无知导致了类似于y2k的隐匿代码腐烂。


在Java 1.5中这对我有效-我去除了特定的可读性例外。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;

public Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}


只是有一个类似的问题,除了我需要一个NodeList而不是一个Document,这就是我的想法。它与以前的解决方案基本相同,但经过增强后可以将根元素作为NodeList删除,并使用erickson的建议使用InputSource代替字符编码问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);

public static Document loadXMLFrom(String xml) throws Exception {
        InputSource is= new InputSource(new StringReader(xml));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }

为了用Java处理XML,我总是倾向于使用Transformer API:

1
2
3
4
5
6
7
8
9
10
11
12
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;

public static Document loadXMLFrom(String xml) throws TransformerException {
    Source source = new StreamSource(new StringReader(xml));
    DOMResult result = new DOMResult();
    TransformerFactory.newInstance().newTransformer().transform(source , result);
    return (Document) result.getNode();
}


推荐阅读

    linux命令刷新加载?

    linux命令刷新加载?,系统,下来,工具,网上,命令,终端,环境变量,以下,文件,路

    linux进入文档命令?

    linux进入文档命令?,工作,地址,图片,系统,标准,命令,信息,设备,一致,发行,Lin

    加载linux内核的命令?

    加载linux内核的命令?,系统,信息,地址,电脑,发行,设备,简介,平台,发展,基础,l

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux加载没有的命令?

    linux加载没有的命令?,系统,服务,工具,信息,设备,标准,工作,命令,检测,代码,

    linux上传文档命令?

    linux上传文档命令?,服务,工具,密码,系统,软件,工作,电脑,综合,命令,文件,Lin

    linux如何命令建文档?

    linux如何命令建文档?,时间,名字,文件,系统,新增,命令,文件名,密码,工作,目

    linux命令打开文档?

    linux命令打开文档?,系统,软件,图片,电脑,一致,环境,名称,发行,中心,官方网

    linux剪切文档命令是?

    linux剪切文档命令是?,标准,系统,数据,文件,命令,地方,第一,位置,电子,名字,l

    linux简单的文档命令?

    linux简单的文档命令?,系统,地址,标准,工作,命令,数据,管理,时间,信息,单位,l

    linux查询文档命令?

    linux查询文档命令?,工作,地址,标准,命令,管理,信息,文件,目录,内容,终端,lin

    加载变量的linux命令?

    加载变量的linux命令?,工具,系统,名称,环境变量,环境,命令,用户,文件,变量,

    linux模块化加载命令?

    linux模块化加载命令?,软件,系统,设备,代码,信息,环境,适当,资料,网上,电脑,

    linux命令加载模块?

    linux命令加载模块?,设备,系统,工具,检测,信息,模块,内核,文件,命令,杂项,lin

    linux文档常用命令?

    linux文档常用命令?,系统,工作,地址,管理,命令,信息,基础,目录,常用命令,文

    linux命令文档离线版?

    linux命令文档离线版?,地址,系统,工作,标准,命令,信息,管理,文件,单位,数据,

    linux命令字符串匹配?

    linux命令字符串匹配?,系统,工具,命令,字符串,灵活,状态,文件,文本,模式,管

    linux命令加载驱动?

    linux命令加载驱动?,官网,电脑,系统,材料,网络,软件,设备,地址,下来,服务,ope

    linux文档注释命令?

    linux文档注释命令?,地址,工作,系统,信息,标准,情况,命令,目录,注释,文件,Lin

    python字符串截取?

    python字符串截取?,代码,步长,位置,分析,字符串,字符,信息,灵活,数字,表示,在