Ошибка при получении дочерних элементов тега body из xml с использованием jdom

Мне нужно пройтись по дереву JDOM и извлечь все данные из раздела body, чтобы использовать их при создании другого документа xml. Я очень новичок в программировании. Я приложил свою концепцию и ошибку, показанную в консоли. Я хочу уточнить, является ли эта концепция правильной или неправильной. Может ли какой-нибудь орган помочь мне узнать об этом и дать направление?

Был бы признателен за любые указатели ..

//root- Existing document's root.
//body- New documents body.
private static Element listChildren(Element root, int depth) {
    System.out.println(root.getName());
    List children = root.getChild("body").getChildren();
    Iterator iterator = children.iterator();
    while (iterator.hasNext()) {
         Element child = (Element) iterator.next();
         System.out.println(child.toString());
         body.addContent(child);
         listChildren(child, depth+1);
         return child;
    }

    return null;
}

Показана ошибка:

Exception in thread "main" java.lang.NullPointerException
    at createXhtml1.listChildren(createXhtml1.java:85)
    at createXhtml1.newXhtml(createXhtml1.java:62)
    at createXhtml1.main(createXhtml1.java:112)

person Arun    schedule 07.03.2011    source источник
comment
Пожалуйста, опубликуйте весь исходный код или выделите строку №. 85.   -  person michal.kreuzman    schedule 07.03.2011
comment
Спасибо...... Список детей = root.getChild(body).getChildren();   -  person Arun    schedule 07.03.2011


Ответы (1)


Итак, судя по комментариям, ваша проблема связана с root.getChild("body"). Этот метод возвращает null (в корневом элементе нет дочернего именованного тела). Вы должны проверить нуль и return null из метода.

....
Element element = root.getChild("body")    
if (element == null)
    return null;
List children = element.getChildren();
...

EDIT Согласно комментарию, вы можете распечатать (или сделать что угодно) все элементы.

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><html> <body> <h1 align=\"center\">Profile</h1><hr /> <div class=\"centered\"> <table><tr><td><strong>Name: </strong></td> <td>A</td> </tr> <tr> <td><strong>Age: </strong></td> <td>23</td> <td>programmer</td></tr><tr><td><strong>Email: </strong></td><td>[email protected]</td></tr></table></div><hr /></body></html>";
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new StringReader(xml));
        listChildren(doc.getRootElement(), 0);
    }

    private static void listChildren(Element root, int depth) {
        System.out.println(root.getName());
        List<Element> children = root.getChildren();
        if (children == null || children.isEmpty())
                return;
        for (Element child : children) {
                 System.out.println(child.toString());
                 listChildren(child, depth+1);
        }

        return;
    }
}
person michal.kreuzman    schedule 07.03.2011
comment
но это мой xml-файл. Определенно у него есть элемент body. ‹?xml version=1.0 encoding=UTF-8?› ‹!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd› ‹html› ‹body› ‹h1 align=center›Profile‹/ h1›‹hr /› ‹div class=centered› ‹table› ‹tr› ‹td›‹strong›Имя: ‹/strong›‹/td› ‹td›A‹/td› ‹/tr› ‹tr› ‹ td›‹strong›Возраст: ‹/strong›‹/td› ‹td›23‹/td› ‹td›программист‹/td›‹/tr› \‹tr›‹td›‹strong›Электронная почта: ‹/strong ›‹/td›‹td›[email protected]‹/td›‹/tr› ‹/table› ‹/div›‹hr /› ‹/body› ‹/html› - person Arun; 07.03.2011
comment
Да, но вы вызываете этот метод рекурсивно в этой строке listChildren(child, depth+1);. Итак, вы берете корень, затем его тело перебирает все дочерние элементы, и вы снова вызываете listChildren для каждого дочернего элемента. Итак, проблема в том, что, например, внутри ‹hi align=center› нет элемента body. - person michal.kreuzman; 07.03.2011
comment
Просто внутри <h1 align="center">...</h1> нет элемента body, и вы хотите получить его в строке 85. В любом случае, что именно должна делать ваша программа? - person michal.kreuzman; 07.03.2011
comment
Точно мне нужны все данные из тела существующего документа, и мне нужно сделать еще один документ с этими данными. - person Arun; 07.03.2011
comment
да .. я получил безошибочный вывод, когда изменил свою кодировку, как вы предложили .. но все равно не смог получить результат. посмотрите мой вывод..‹?xml version=1.0 encoding=UTF-8?› ‹!DOCTYPE html PUBLIC --//W3C//DTD XHTML 1.0 Transitional//EN w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd› ‹html›‹head›‹title› First Try‹/title›‹meta http-equiv=Content-Type content=text/html; charset=utf-8 /›‹style type=text/css›h1 { text-align: center; } div.centered {text-align: center;} div.centered table { text-align: left;}‹/style›‹/head›‹body›‹h1 align=center›Body part‹/h1›‹hr / ›‹/тело›‹/html› - person Arun; 07.03.2011
comment
@Arun Я добавил фрагмент кода, который печатает все элементы (вы можете легко переписать его, чтобы создать другой документ с его данными). Вы должны прочитать статью Рекурсия, чтобы полностью понять ее. - person michal.kreuzman; 07.03.2011
comment
Это очень мило с вашей стороны .. Обязательно отвечу вам после того, как просмотрю вашу статью. - person Arun; 07.03.2011
comment
@ Михал Кройцман, я прошел через рекурсию. Но проблема с нашей программой в том, что root.getChild(body)==null. Но мой xml имеет root-html, head-head, body-body. то как он станет нулевым. В моей функции root является параметром, и я также могу получить доступ к root внутри функции, но я не могу использовать элемент body. не могли бы вы дать решение.. - person Arun; 07.03.2011
comment
Root не всегда является вашим параметром. При первом вызове метода listChildren в корне есть элемент body, но при втором вызове его нет, потому что вы вызываете метод listChildren и из метода listChildren. Поэтому сосредоточьтесь на строке 91 в своей программе и посмотрите, что вы указали в качестве параметра. Это дочерний элемент элемента body (например, H1), поэтому программа снова вкладывается в listChildren с параметрами child (H1) и depth + 1. Затем вы хотите получить тело из этого дочернего элемента (H1), но, очевидно, нет элемента с таким именем. Это все. Для лучшего воображения используйте отладчик, где вы можете более четко увидеть весь процесс. - person michal.kreuzman; 07.03.2011
comment
Привет @ Михал Кройцман, приветствие на весь день... ваше предположение очень правильное. Я думаю, что могу решить эту проблему, изменив свой код как List‹Element› children = current.getChildren(). Но все же проблема заключается в том, что при первом вызове, когда текущий элемент становится корневым, метод getChildren() возвращает null. Это root.getChild(body)==null. Не могли бы вы определить, в чем проблема.. - person Arun; 08.03.2011
comment
@Arun Привет, в этом случае, пожалуйста, опубликуйте свой полный код с входным файлом. - person michal.kreuzman; 08.03.2011
comment
@Michal Kreuzman Привет, приветствую вас сегодня ... Я прикрепил свой полный код в stackoverflow в качестве еще одного qn. Пожалуйста, просмотрите это ... - person Arun; 09.03.2011