【问题标题】:How to add an attribute to an XML node in Java 1.4如何在 Java 1.4 中向 XML 节点添加属性
【发布时间】:2008-09-30 18:07:59
【问题描述】:

我试过了:

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 错误。 ma​​pNode 是一个有效的节点。我已经打印出来了

我想也许这段代码在 Java 1.4 中不起作用。我真正需要的是使用 Element 的替代方法。我试过做

NamedNodeMap atts = mapNode.getAttributes();
    Attr att = doc.createAttribute("objId");
    att.setValue(docId);    
    atts.setNamedItem(att);

但是 getAttributes() 在服务器上返回 null。即使它不是,我在本地使用与服务器上相同的文档。它可以打印出 getNodeName() 只是 getAttributes() 不起作用。

【问题讨论】:

  • 您能否提供更多详细信息?确切的堆栈跟踪是什么?
  • 堆栈跟踪显示的唯一有用信息是 java.lang.ClassCastException
  • 将它扔到 Element e = (Element) doc.getFirstChild() 行
  • mapNode.getClass().getName() 报告什么?如果它不是一个元素,那么了解它的真正含义将帮助您解决问题。
  • 成为有效节点并不意味着它是一个元素。 'getNodeName' 在两台机器上打印什么?

标签: java xml


【解决方案1】:

我在服务器上使用了不同的 dtd 文件。这就是问题的根源。

【讨论】:

    【解决方案2】:

    第一个子节点可能是纯空格文本节点或类似节点吗?

    试试:

    System.out.println(doc.getFirstChild().getClass().getName());
    

    编辑:

    刚刚在我自己的代码中查过,你需要:

    doc.getDocumentElement().getChildNodes();
    

    或者:

    NodeList nodes = doc.getElementsByTagName("MyTag");
    

    【讨论】:

      【解决方案3】:

      如前所述,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");
      

      更新:

      您似乎混淆了NodeElementElementNode 的实现,但肯定不是唯一的。因此,并非所有Node 都可以转换为Element。如果演员在一台机器上工作而不是在另一台机器上工作,那是因为你从getMapNode() 得到了其他东西,因为解析器的行为不同。 XML 解析器在 Java 1.4 中是可插入的,因此您可能会从不同的供应商那里得到一个完全不同的实现,甚至有不同的错误。

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

      【讨论】:

      • 完全同意您的更新,如果它是服务器上的不同解析器,它可能会以不同方式处理仅空白文本节点,这将导致错误(取决于 getMapNode 的编写方式)
      【解决方案4】:

      我认为你对 doc.getFirstChild() 输出的转换是你得到异常的地方——你得到了一些非元素节点对象。堆栈跟踪上的行号是否指向该行?您可能需要执行 doc.getChildNodes() 并迭代以找到第一个 Element 子节点(文档根),跳过非 Element 节点。

      您的 e.setAttribute() 调用看起来很合理。假设 e 是一个元素,你实际上到达了那条线......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多