我有以下代码:

DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);

我如何才能让它解析包含在字符串而不是文件中的XML ?


当前回答

将字符串转换为InputStream并将其传递给DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

编辑作为对bendin关于编码的评论的回应,见shsteimer对这个问题的回答。

其他回答

我在用这个方法

public Document parseXmlFromString(String xmlString){
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream = new    ByteArrayInputStream(xmlString.getBytes());
    org.w3c.dom.Document document = builder.parse(inputStream);
    return document;
}

我有这个函数在我的代码库,这应该为你工作。

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

也可以看到类似的问题

将字符串转换为InputStream并将其传递给DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

编辑作为对bendin关于编码的评论的回应,见shsteimer对这个问题的回答。

一种方法是使用接受InputSource而不是接受文件的parse版本

SAX InputSource可以从Reader对象构造。一个Reader对象是StringReader

就像这样

parse(new InputSource(new StringReader(myString))) may work. 

你可以使用GitHub上提供的Scilca XML progress包。

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();