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

249

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

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

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

Dewayne
источник
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);
}

также увидеть этот похожий вопрос

shsteimer
источник
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. 
Uri
источник
5

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

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

duffymo
источник
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)
LGB
источник