Не можете вызвать getElementsByTagName для узла в Xerces или Neko?

Привет всем Я пытаюсь разобрать дерево DOM с помощью Neko/Xerces в Java.

NodeList divs = this.doc.getElementsByTagName("DIV");
for(int i=0; i < divs.getLength(); i++) {
    NodeList images = divs.item(i).parentNode().getElementsByTagName("IMG");
    // operate on these
}

это то, что я в идеале хотел бы сделать. Кажется, я могу только позвонить getElementsByTagName на сам документ? Я делаю что-то неправильно? Должен ли я быть в состоянии назвать это на Node элемент?

Из документов видно, что его там нет: http://xerces.apache.org/xerces-j/apiDocs/org/w3c/dom/Node.html поэтому, может быть, мне нужно сделать это по-другому?

Спасибо!

2 ответа

NodeList возвращает только Nodes, а getElementsByTagName доступен только на узле Element. Поэтому вам необходимо привести ваш Node к элементу, вот пример ниже.

final NodeList images = ((Element)divs.item(i).getParentNode()).getElementsByTagName("IMG");

Однако будьте осторожны с этим, так как предполагается, что getParentNode() всегда возвращает элемент

Это было бы безопаснее, но гораздо более многословно

final Node n = divs.item(i).getParentNode();

if(n instanceof Element) {
    final Element e = (Element)n;
    e.getElementsByTagName("IMG");
}

Да, это странно. Python xml.dom.minidom имеет Node.getElementsByTagName. Может быть, это не является частью стандарта. Вместо этого вы можете повторить внутренний цикл divs.item(i).parentNode().getChildNodes(),

Другие вопросы по тегам