2013-04-13 3 views
0

Вот мой XML-файл:Java DOM Ошибка синтаксического анализа

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE Server SYSTEM "Server.dtd"> 
<Server> 
    <MaximumUserNumber>2</MaximumUserNumber> 
    <ServerPortNumber>1234</ServerPortNumber> 
    <MessagesQueueSize>5</MessagesQueueSize> 
</Server> 

вот мой Server.dtd:

<?xml version="1.0" encoding="UTF-8"?> 
<!ELEMENT Server 
     (MaximumUserNumber, 
      ServerPortNumber, 
      MessagesQueueSize)> 
<!ELEMENT MaximumUserNumber (#PCDATA)> 
<!ELEMENT ServerPortNumber (#PCDATA)> 
<!ELEMENT MessagesQueueSize (#PCDATA)> 

Вот мой код, который дает мне NullPointerException:

public Server() { 
     try { 

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      dbf.setValidating(true); 
      Document document = dbf.newDocumentBuilder().parse("config.xml"); 
      document.normalizeDocument(); 
      NodeList nl = document.getElementsByTagName("MaximumUserNumber"); 
      nl.item(0); // this line causes exception 

      } 
} 

Что я делаю неправильно? Благодаря!

+0

Я пробовал свой код с Java 6. Он работал без каких-либо исключений. Какую версию Java вы используете? Вы должны дважды проверить, что 'config.xml', который фактически обрабатывается вашим кодом, действительно является предполагаемой версией. Вы действительно уверены, что ваш документ проверен на версию DTD, которую вы считали? В любом случае вы должны проверить длину своего 'NodeList' перед вызовом' nl.item (0) '. Очевидно, что в вашем случае длина равна 0. Если вы создаете независимый тестовый проект только с этими фрагментами кода, вы все равно получите длину 0? – vanje

ответ

1

Вы хорошо выглядите.

Это даже не делает никаких исключений на jdk-7. Возможно, вы не включили код, который делает.

Вы просто не сделать еще один шаг в поиске значение элемента:

NodeList nodeList = document.getElementsByTagName("MaximumUserNumber"); 
    Node foundNode = nodeList.item(0); 
    Node textNode = foundNode.getChildNodes().item(0); 
    String value = textNode.getNodeValue(); 
    System.out.println(value); 

Выход

2 

Объяснение

document.getElementsByTagName("MaximumUserNumber") возвращение нодлист. Он имеет единственный найденный узел. Каждый элемент узла (тип == ELEMENT_NODE), даже если он содержит только текст, имеет дочерние элементы. В этом случае единственным дочерним элементом является узел типа TEXT_NODE: Node textNode = foundNode.getChildNodes().item(0);. Из узла этого типа вы просто получаете его значение.

Существует более быстрый способ получить текстовое значение из текста только элемент:

NodeList nodeList = document.getElementsByTagName("MaximumUserNumber"); 
    Node foundNode = nodeList.item(0); 
    String value = foundNode.getTextContent(); 
    System.out.println(value); 

Здесь .getTextContent() возвращает текстовое содержимое этого узла и его потомков.

Оба случая не являются действительно безопасными (нет проверок нуля или проверок типа узла), но если использование со схемой может рассматриваться как таковое.

Смежные вопросы