为什么Node没有getElementByTagName()?

时间:2016-04-18 13:19:04

标签: java xml parsing dom

我想了解为什么在XML解析期间想要访问特定元素值时必须执行以下操作:

    NodeList controlList = poDoc.getElementsByTagName("control");
    Node controlNode = controlList.item(0); 
    Element controlElem = (Element) controlNode;

    usageType = controlElem.getElementsByTagName("usage_type").item(0).getFirstChild().getNodeValue();

这里我必须将controlNode强制转换为(Element),因为我想访问DOM树下面的另一个元素。这一切都按预期工作,我只是想了解为什么会这样。为什么不能对Node-object进行getElementByTagName或类似的调用?或者在那里,我只是不知道。由于我对Java很新,可能就是这种情况。肯定有更好的理由比#34;因为这是界面的实现方式"。

3 个答案:

答案 0 :(得分:1)

根据javadoc,Node是XML文档中可以存在的任何数据,包括注释,标题和文本(XML元素的文本值),因此并非所有类型的节点都可以拥有"名称"或者有孩子元素。

Element定义了可能具有可通过名称检索的子元素的节点种类。

答案 1 :(得分:1)

只有文档和元素可以包含元素。

所以DOM API的设计者简单地决定来定义方法 仅getElementsByTagNameNodeDocument中的Element

替代设计应该在getElementsByTagName类中定义Node,如果节点不能包含元素,则返回空节点列表。 (这大致是XPath规范所做的设计决定)。

答案 2 :(得分:1)

根据XML标准,XML文档中的每个实体都是Node,并且XML文档中的所有实体都不能包含子元素。解析器无法知道引用的Node是标题,元素还是注释,因此在没有首先检查其类型的情况下使用这样的方法是不明智的。

即使您希望以某种方式格式化XML,通常也会检查Node是否实际上是Element,例如:

if(node instanceof Element) {
    NodeList usagetypes = ((Element)node).getElementsByTagName("usage_types");
    ...