Обработка пустых узлов с помощью Java DOM - PullRequest
4 голосов
/ 25 октября 2010

У меня есть вопрос, касающийся XML, использования DOM в Java и пустых узлов.В настоящее время я работаю над проектом, в котором я беру XML-файл дескриптора абстрактных машин (для разбора текста) и анализирую с ними ряд входных строк.Фактическое построение и интерпретация этих абстрактных машин все сделано и работает нормально, но я столкнулся с довольно интересным требованием XML.В частности, мне нужно иметь возможность превратить пустой узел InputString в пустую строку ("") и по-прежнему выполнять процедуры синтаксического анализа.Проблема, однако, возникает, когда я пытаюсь извлечь этот пустой узел из моего дерева XML.Это вызывает исключение нулевого указателя, и тогда вообще плохие вещи начинают происходить.Вот оскорбительный фрагмент XML (обратите внимание, что первый элемент пуст):

    <InputStringList>
        <InputString></InputString>
        <InputString>000</InputString>
        <InputString>111</InputString>
        <InputString>01001</InputString>
        <InputString>1011011</InputString>
        <InputString>1011000</InputString>
        <InputString>01010</InputString>
        <InputString>1010101110</InputString>
    </InputStringList>

Я извлекаю строки из списка, используя:

//Get input strings to be validated
xmlElement = (Element)xmlMachine.getElementsByTagName(XML_INPUT_STRING_LIST).item(0);
xmlNodeList = xmlElement.getElementsByTagName(XML_INPUT_STRING);
for (int j = 0; j < xmlNodeList.getLength(); j++) {

    //Add input string to list
    if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) {
        arrInputStrings.add(xmlNodeList.item(j).getFirstChild().getNodeValue());

    } else {
        arrInputStrings.add("");

    }
}

Как мне обращаться с этим пустым регистром?Я нашел много информации об удалении пустых текстовых узлов, но я все еще должен анализировать пустые узлы как пустые строки.В идеале я бы хотел не использовать специальный символ для обозначения пустой строки.

Заранее благодарим вас за потраченное время.

Ответы [ 2 ]

7 голосов
/ 25 октября 2010
if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) {

nodeValue не должно быть нулевым; это будет firstChild сам по себе, который может быть нулевым и должен быть проверен на:

Node firstChild= xmlNodeList.item(j).getFirstChild();
arrInputStrings.add(firstChild==null? "" : firstChild.getNodeValue());

Однако обратите внимание, что это все еще чувствительно к содержимому, являющемуся только одним текстовым узлом. Если у вас есть элемент с другим элементом или какой-либо текст и раздел CDATA, просто получить значение первого дочернего элемента недостаточно, чтобы прочитать весь текст.

Что вам действительно нужно, так это textContent свойство от DOM Level 3 Core, которое даст вам весь текст внутри элемента, как бы он ни содержался.

arrInputStrings.add(xmlNodeList.item(j).getTextContent());

Это доступно в Java 1.5 и далее.

1 голос
/ 12 июля 2012

Вы можете использовать такую ​​библиотеку, как jOOX , чтобы в целом упростить стандартную манипуляцию с DOM.С помощью jOOX вы получите список строк:

List<String> strings = $(xmlMachine).find(XML_INPUT_STRING_LIST)
                                    .find(XML_INPUT_STRING)
                                    .texts();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...