Як у Java я розбираю XML як рядок замість файлу?


249

У мене є такий код:

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

Як я можу його розібрати XML, що міститься в рядку замість файлу?


7
Також зауважте, що javax.xml.parsers.DocumentBuilder.parse(string)припускає, що рядок є урі (страшно ...)
Крістоф Руссі

Відповіді:


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

1
Переконайтеся, що ви використовуєте правильну заяву про імпорт:import org.xml.sax.InputSource;
Daniel Eisenreich

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

EDIT
У відповідь на Бендін «s коментар про кодування см shsteimer » відповідь s на це питання.


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.