我试过了:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
Node mapNode = getMapNode(doc);
System.out.print("\r\n elementName "+ mapNode.getNodeName());//This works fine.
Element e = (Element) mapNode; //This is where the error occurs
//it seems to work on my machine, but not on the server.
e.setAttribute("objectId", "OBJ123");
但是这会在将其强制转换为Element的行上抛出java.lang.ClassCastException错误。 mapNode是一个有效的节点。我已将其打印出来
我想这个代码可能在Java 1.4中不起作用。我真正需要的是使用Element的替代方案。我试着做了
NamedNodeMap atts = mapNode.getAttributes();
Attr att = doc.createAttribute("objId");
att.setValue(docId);
atts.setNamedItem(att);
但是getAttributes()在服务器上返回null。即使它不是,我在本地使用与服务器上相同的文档。并且它可以打印出getNodeName(),只是getAttributes()不起作用。
答案 0 :(得分:1)
我在服务器上使用了不同的dtd文件。这导致了这个问题。
答案 1 :(得分:0)
第一个孩子可能只是一个只有空格的文本节点吗?
尝试:
System.out.println(doc.getFirstChild().getClass().getName());
编辑:
只需在我自己的代码中查找,您需要:
doc.getDocumentElement().getChildNodes();
或者:
NodeList nodes = doc.getElementsByTagName("MyTag");
答案 2 :(得分:0)
我认为你对doc.getFirstChild()输出的强制转换是你获得异常的地方 - 你得到了一些非元素节点对象。堆栈跟踪中的行号是否指向该行?您可能需要执行doc.getChildNodes()并迭代以查找第一个Element子项(doc root),跳过非元素节点。
您的e.setAttribute()调用看起来很合理。假设e是一个元素,你实际上到达那一行......
答案 3 :(得分:0)
如前所述,ClassCastException
可能没有引发setAttribute
。检查堆栈中的行号。我的猜测是getFirstChild()
返回的是DocumentType
,而不是Element
。
试试这个:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
Element e = (Element) doc.getDocumentElement().getFirstChild();
e.setAttribute("objectId", "OBJ123");
更新:
您似乎对Node
和Element
感到困惑。 Element
是Node
的实现,但肯定不是唯一的实现。因此,并非所有Node
都可投放到Element
。如果演员在一台机器而不在另一台机器上工作,那是因为你从getMapNode()
获得了其他东西,因为解析器的行为不同。 XML解析器可以在Java 1.4中插入,因此您可以从不同的供应商获得完全不同的实现,甚至可以使用不同的错误。
由于您没有发布getMapNode()
,我们无法看到它正在做什么,但您应该明确指出要返回的节点(使用getElementsByTagName
或其他方式)。