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

198

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

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

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

  • 6
    Также обратите внимание, что javax.xml.parsers.DocumentBuilder.parse(string) предполагает, что строка является URI (ужасно ...)
Теги:
string
file
parsing

6 ответов

412
Лучший ответ

У меня есть эта функция в моей базе кода, это должно работать для вас.

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

также см. этот похожий вопрос

  • 0
    @shsteimer Я передаю строку XML, и она возвращает ноль. Это не исключение. Что должно быть не так?
  • 0
    @sattu: Вы должны опубликовать это как новый вопрос. Трудно сказать, не видя ваш код.
Показать ещё 2 комментария
14

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

Источник данных SAX InputSource может быть создан из объекта Reader. Один объект Reader - это StringReader

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

parse(new InputSource(new StringReader(myString))) may work. 
  • 0
    Отлично. Спасибо
5

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

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

4

Преобразуйте строку в InputStream и передайте ее в DocumentBuilder

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

EDIT
В ответ на комментарий bendin относительно кодировки см. ответ shsteimer на этот вопрос.

  • 1
    Я бы предпочел StringReader, потому что он избегает String.getBytes (), но обычно это также должно работать.
  • 3
    Когда вы вызываете getBytes (), какую кодировку вы ожидаете использовать? Как вы говорите парсеру XML, какую кодировку он получает? Вы ожидаете, что это угадать? Что происходит, когда вы находитесь на платформе, где кодировка по умолчанию не UTF-8?
1

Я использую этот метод

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню