В Java, как я могу разобрать XML как строку вместо файла?


249

У меня есть следующий код:

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

Как я могу получить его для анализа XML, содержащегося в строке, а не в файле?


7
Также обратите внимание, что javax.xml.parsers.DocumentBuilder.parse(string)предполагается, что строка является URI (ужасно ...)
Кристоф Русси

Ответы:


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, и она возвращает ноль. Это не исключение. Что должно быть не так?
Sattu

@sattu: Вы должны опубликовать это как новый вопрос. Трудно сказать, не видя ваш код.
Александр Малахов

Большое спасибо, спас меня куча строк кода, я преобразовал его обратно в текст, но я знал, что есть лучший способ!
nkuebelbeck

3
если у меня есть <? XML>, он возвращает пустой узел, что я могу сделать?
Дежелл

1
Убедитесь, что вы используете правильное утверждение импорта:import org.xml.sax.InputSource;
Даниэль Эйзенрайх

18

Одним из способов является использование версии синтаксического анализа, которая принимает InputSource, а не файл

SAX InputSource может быть создан из объекта Reader. Один объект Reader является StringReader

Так что-то вроде

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

5

Javadocs показывают, что метод разбора перегружен.

Создайте StringStream или InputSource, используя вашу строку XML, и вы должны быть установлены.


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?
до

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

Вы можете использовать пакет Scilca XML Progession, доступный на GitHub.

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.