如何在Java 1.4中向XML节点添加属性

时间:2008-09-30 18:07:59

标签: java xml

我试过了:

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()不起作用。

4 个答案:

答案 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");

更新:

您似乎对NodeElement感到困惑。 ElementNode的实现,但肯定不是唯一的实现。因此,并非所有Node都可投放到Element。如果演员在一台机器而不在另一台机器上工作,那是因为你从getMapNode()获得了其他东西,因为解析器的行为不同。 XML解析器可以在Java 1.4中插入,因此您可以从不同的供应商获得完全不同的实现,甚至可以使用不同的错误。

由于您没有发布getMapNode(),我们无法看到它正在做什么,但您应该明确指出要返回的节点(使用getElementsByTagName或其他方式)。