XML-документ в DOM-объект с использованием DocumentBuilderFactory - PullRequest
2 голосов
/ 04 августа 2010

В настоящее время я изменяю фрагмент кода и мне интересно, повлияет ли способ форматирования XML (табуляции и пробелов) на способ его анализа в классе DocumentBuilderFactory.

По сути, вопрос заключается в следующем: могу ли я передать большую длинную строку без пробелов в DocumentBuilderFactory или ее нужно каким-то образом отформатировать?

Заранее спасибо, ниже приводится определение класса с веб-сайта Oracles.

Класс DocumentBuilderFactory

"Определяет фабричный API, который позволяет приложениям получать анализатор, который создает деревья объектов DOM из документов XML."

Ответы [ 4 ]

3 голосов
/ 24 сентября 2010

Документы будут другими.Вкладки и новые строки будут преобразованы в текстовые узлы.Вы можете устранить их, используя следующий метод в DocumentBuilderFactory:

Но для того, чтобы он работал, вы должны настроить анализатор DOM для проверки содержимогодля схемы DTD или xml.

В качестве альтернативы вы можете программно удалить лишние пробелы самостоятельно, используя что-то вроде следующего:

public static void removeEmptyTextNodes(Node node) {
    NodeList nodeList = node.getChildNodes();
    Node childNode;
    for (int x = nodeList.getLength() - 1; x >= 0; x--) {
        childNode = nodeList.item(x);
        if (childNode.getNodeType() == Node.TEXT_NODE) {
            if (childNode.getNodeValue().trim().equals("")) {
                node.removeChild(childNode);
            }
        } else if (childNode.getNodeType() == Node.ELEMENT_NODE) {
            removeEmptyTextNodes(childNode);
        }
    }
}
1 голос
/ 24 сентября 2010

DocumentBuilder создает различные объекты DOM для строки XML с переводами строки и строки XML без перевода строки. Вот код, который я тестировал:

StringBuilder sb = new StringBuilder();
sb.append("<root>").append(newlineChar).append("<A>").append("</A>").append(newlineChar).append("<B>tagB").append("</B>").append("</root>");

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

InputStream    xmlInput = new ByteArrayInputStream(sb.toString().getBytes());
Element documentRoot = builder.parse(xmlInput).getDocumentElement();

NodeList nodes = documentRoot.getChildNodes();

System.out.println("How many children does the root have? => "nodes.getLength());

for(int index = 0; index < nodes.getLength(); index++){
    System.out.println(nodes.item(index).getLocalName());
}

Выход: <br>How many children does the root have? => 4 <br>null <br> A <br>null<br> B

Но если новый newlineChar удален из StringBuilder, Выходной результат: <br>How many children does the root have? => 2 <br>A <br>B</p> <p>

Это демонстрирует, что объекты DOM, сгенерированные DocumentBuilder, отличаются.

1 голос
/ 04 августа 2010

Это не должно влиять на возможности анализатора, если строка valid XML. Вкладки и новые строки удаляются или игнорируются парсерами и действительно предназначены для эстетики человеческого читателя.

Обратите внимание, что вам нужно будет передать входной поток (например, StringBufferInputStream) в DocumentBuilder, поскольку строковая версия синтаксического анализа предполагает, что это URI для XML.

0 голосов
/ 24 сентября 2010

Не должно быть никакого эффекта в отношении формата XML-строки, но я могу вспомнить странную проблему, когда я передавал длинную строку в синтаксический анализатор XML.Пазер не смог разобрать XML-файл, так как он был записан в одну длинную строку.

Может быть лучше, если вы вставите разрывы строк в таком виде, чтобы строки были длиннее, чем,скажем, 1000 байтов.

Но, к сожалению, я не помню, почему произошла эта ошибка и какой анализатор я принял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...