我想了解为什么在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;因为这是界面的实现方式"。
答案 0 :(得分:1)
根据javadoc,Node
是XML文档中可以存在的任何数据,包括注释,标题和文本(XML元素的文本值),因此并非所有类型的节点都可以拥有"名称"或者有孩子元素。
Element
定义了可能具有可通过名称检索的子元素的节点种类。
答案 1 :(得分:1)
只有文档和元素可以包含元素。
所以DOM API的设计者简单地决定来定义方法
仅getElementsByTagName
班Node
和Document
中的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");
...