在Java中,如何将XML解析为字符串而不是文件?


249

我有以下代码:

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

如何获取它来解析包含在字符串而不是文件中的XML?


7
另请注意,javax.xml.parsers.DocumentBuilder.parse(string)假设字符串是uri(糟糕……)
Christophe Roussy,2016年

Answers:


479

我的代码库中有此功能,它应该对您有用。

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);
}

也看到这个类似的问题


3
@shsteimer我传入xml字符串,并且返回null。它不会引发任何异常。怎么了?
sattu

@sattu:您应该将其发布为新问题。不看代码就很难分辨。
亚历山大·马拉霍夫

非常感谢,为我节省了很多代码行,我将其转换回文本,但是我知道有更好的方法!
nkuebelbeck

3
如果我有<?XML>,它将返回一个空节点,我该怎么办?
Dejell 2014年

1
检查您是否使用了正确的导入语句:import org.xml.sax.InputSource;
Daniel Eisenreich

18

一种方法是使用采用InputSource而不是文件的解析版本

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

所以像

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

5

javadocs显示parse方法已重载。

使用您的字符串XML创建一个StringStream或InputSource,并且应该设置您的状态。


4

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

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

编辑
为了回应bendin关于编码的评论,请参阅shsteimer对这个问题的回答。


1
我更喜欢StringReader,因为它避免了String.getBytes(),但这通常也应该起作用。
迈克尔·迈尔斯

3
调用getBytes()时,您希望使用哪种编码?您如何告诉XML解析器获取哪种编码?您希望它能猜到吗?当您使用默认编码不是UTF-8的平台时会发生什么?
bentin

2

我正在使用这种方法

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;
}

0

您可以使用GitHub上提供的Scilca XML Progession软件包。

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

0

只需输入

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.